【问题标题】:Groovy .each closure wrapping elements in an unwanted Object[]Groovy .each 闭包将元素包装在不需要的 Object[] 中
【发布时间】:2013-07-10 12:23:42
【问题描述】:

我正在测试一个返回 Object[] 列表的服务

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

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

assertEquals(A_SIZE, row[0].length)

测试顺利,但我不明白为什么我需要“[0]”,因为据我从 Groovy 规范了解,“行”应该是 Object[8]。

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

【问题讨论】:

  • 闻起来像 Groovy 类型强制中的一个错误...作为一种解决方法,您可以使用 list.each { row -&gt;
  • 有效!请发布解决方案作为回复,我会接受。谢谢
  • 完成 :-)(我认为这是根本原因)

标签: groovy closures


【解决方案1】:

我认为 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 是否应该在邮件列表中进行这种解构一直存在争议,但目前确实如此 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多