Grails 为什么groovy会跳过each语句

Grails 为什么groovy会跳过each语句,grails,groovy,Grails,Groovy,在grails中,我有以下控制器操作来确定一个项目是否在我的购物车中 def itemInCart(){ def cartHasItem = false def product = Product.findOrCreateByPartNumberAndColor(params.partNumber, params.color) def cart = shoppingCartItems() cart.each() { item -> if (i

在grails中,我有以下控制器操作来确定一个项目是否在我的购物车中

def itemInCart(){
    def cartHasItem = false
    def product = Product.findOrCreateByPartNumberAndColor(params.partNumber, params.color)
    def cart = shoppingCartItems()
    cart.each() { item ->
        if (item['partInfo']['partNumber'] == params.partNumber && item['partInfo']['color']==params.color){
            cartHasItem = true
        } 
    }
    render(cartHasItem)
}
我向购物车添加了一个项目

购物车时的购物车。each()是

[{partInfo={partNumber=69874, color=BLACK}, qty=1, price=16.99}]
参数零件号=69874

params.color=黑色


问题是我的代码完全跳过了each()块。debug点击购物车。each(){item->,然后径直进行渲染

看起来您想使用
任何
而不是
每个
,如下所示:

def cartHasItem = cart.any{ item ->
  item['partInfo']['partNumber'] == params.partNumber && item['partInfo']['color']==params.color
}

看起来您想在此处使用
any
而不是
each

def cartHasItem = cart.any{ item ->
  item['partInfo']['partNumber'] == params.partNumber && item['partInfo']['color']==params.color
}

我想扩大@Dónal对这个问题的评论,找出为什么每个()和每个()都不同

我从未使用过object.each(){},而是一直使用以下形式:

cart.each { item ->
    // do work
}
但是,在这个简单的测试中,我无法让每个()都失败:

def myfn() {
    def items = [1,2,3]
    def ret = false
    items.each() {item -> if (item == 2) { ret = true }}
    return ret
}
myfn()
==> true
我尝试了一个更复杂的版本,使用一个映射来表示您正在使用的数据,而一个简单的版本只是使用

[[a:1, b:2, c:3]].each() { println it }
它始终呈现项目

您使用的是什么版本的groovy


我假设您的数据实际上是一个映射列表,您对该项的语法比groovy更为简洁。

我想进一步介绍@Dónal对这个问题的评论,以找出为什么每个()和每个()都不同

我从未使用过object.each(){},而是一直使用以下形式:

cart.each { item ->
    // do work
}
但是,在这个简单的测试中,我无法让每个()都失败:

def myfn() {
    def items = [1,2,3]
    def ret = false
    items.each() {item -> if (item == 2) { ret = true }}
    return ret
}
myfn()
==> true
我尝试了一个更复杂的版本,使用一个映射来表示您正在使用的数据,而一个简单的版本只是使用

[[a:1, b:2, c:3]].each() { println it }
它始终呈现项目

您使用的是什么版本的groovy


我假设您的数据实际上是一个映射列表,您对项目的语法比groovy更准确。

shoppingCartItems()的返回类型是什么?-是否可能
购物车的计算结果为groovy false?它返回ArrayList我认为这不会解决您的问题,但您应该更改
每个()
每个
@Dónal,实际上,删除Paren完全可以解决问题。如果你把它作为一个解决方案,我会投它的票。@BalRog cool,我已经把它作为一个答案发布了
shoppingCartItems()的返回类型是什么
-是否可能
cart
的计算结果为groovy false?它返回ArrayList我认为这不会解决您的问题,但您应该更改
每个()
每个
@Dónal,实际上,删除paren完全可以解决问题。如果你把它作为解决方案,我会投赞成票。@BalRog cool,我把它作为一个答案发布了它更有效,因为当它看到匹配时,它会将布尔值设置为true并停止循环,但没有任何东西会将布尔值设置为false。如果存在N-ma的混合tches和M不匹配,
cartHasItem
将被设置为true N次(对于较大的N,它可能最终为true),但这两种情况下的结果都是一样的。效率更高,因为当它看到匹配时,会将布尔值设置为true并停止循环,但没有任何东西会将布尔值设置为false。如果存在N个匹配项和M个非匹配项的混合,
cartHasItem
将被设置为true N次(对于较大的N,它可能会最终设置为true),但无论哪种情况,结果都是一样的