Grails 为什么groovy会跳过each语句
在grails中,我有以下控制器操作来确定一个项目是否在我的购物车中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
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),但无论哪种情况,结果都是一样的