为什么groovy跳过每个声明

时间:2014-10-24 21:00:12

标签: grails groovy

我在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)
}

我在购物车中添加了一个项目

cart.each()时的

购物车

[{partInfo={partNumber=69874, color=BLACK}, qty=1, price=16.99}]

params.partNumber = 69874

params.color = BLACK

问题是我的代码完全跳过了each()块。 debug hits cart.each() { item ->然后直接渲染

2 个答案:

答案 0 :(得分:4)

您希望在此处使用any代替each

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

答案 1 :(得分:0)

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

我从未使用过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更具有语法性。