Groovy .each封闭包装元素在不需要的Object []中

时间:2013-07-10 12:23:42

标签: groovy closures

我正在测试一个返回List of Object []

的服务
List<Object[]> list = someService.someMethod()
list.each { Object[] row ->
    assertEquals(A_SIZE,row.length)
}

我仔细检查了调试器,list的元素是Object [8],但是行被初始化为Object [1],其中包含一个Object [8],所以测试失败,除非A_SIZE为1(这是没有意义的我的情景)。 如果我将断言更改为:

assertEquals(A_SIZE, row[0].length)

测试没问题,但我不明白为什么我需要“[0]”,因为“row”应该是Object [8],据我从Groovy规范中理解。

我使用groovy 2.1和grails 2.3M2;该列表来自MyDomainClass.createCriteria()。

1 个答案:

答案 0 :(得分:4)

我认为Groovy在解决如何将Object[]映射到Closure参数方面遇到了麻烦。解决方法是不要像这样声明Closure参数的类型:

list.each { row ->
    assertEquals(A_SIZE,row.length)
}

我已经问过了,我认为这是因为Groovy目前试图将对象“适合”Closure参数(以这种方式工作)

// Returns [ 3, 7 ]
[ [ 1, 2 ], [ 3, 4 ] ].collect { a, b ->
    a + b
}

关于Groovy是否应该在邮件列表上进行此类解构,一直存在争议,但就目前而言,确实如此: - )