groovy闭包的奇怪行为引用类字段

时间:2014-04-11 09:24:44

标签: groovy closures

这是一个代码示例:

class StaticTest {

  static def list = [1, 2, 3]

  void printsNothing() {
    [].with { list.each { println it } }
  }

  void printsList() {
    new Object().with { list.each { println it } }
  }

  public static void main(String[] args) {
    new StaticTest().with {
      println "Expected: "
      printsList()

      println "Strange: "
      printsNothing()
    }
  }
}

正如您所看到的,printsNothingprintsList中的闭包是相同的,但结果不同,因为printsNothing确实不打印任何内容,就像list为空。这是输出:

Expected: 
1
2
3
Strange: 

我在启用了invokedynamic支持时使用了Groovy 2.2.2。

关于这是一个bug还是我对Groovy一无所知的任何建议?

1 个答案:

答案 0 :(得分:2)

这是在user mailing list recently,这是因为它在空列表的所有元素(和list)中寻找属性[].list == []。如果您将printsNothing方法更改为:

void printsNothing() {
    // Use this.list to get round local `with` scoping
    [].with { this.list.each { println it } }
}