Groovy 使用';它';

Groovy 使用';它';,groovy,Groovy,闭包中的代码可以引用it变量 8.times { println it } 或 考虑到这种行为,您不能期望以下代码打印0011 2.times { println it mywith { println it } } 相反,我必须写作 2.times { i -> println i mywith { println i } } 我的问题是:为什么没有参数的闭包会覆盖it变量,即使它们不需要它。我认为这与Groovy

闭包中的代码可以引用it变量

8.times { println it }

考虑到这种行为,您不能期望以下代码打印
0011

2.times {
   println it 

   mywith {
      println it
   }
}
相反,我必须写作

2.times { i ->
   println i 

   mywith {
      println i
   }
}

我的问题是:为什么没有参数的闭包会覆盖
it
变量,即使它们不需要它。

我认为这与Groovy的功能有关:

闭包可能有1…N个参数, 可以是静态类型或 非类型化。第一个参数是 可通过隐式非类型化 参数命名它,如果没有显式 参数被命名为。如果打电话的人 不指定任何参数,则 第一个参数(并且,通过扩展, 它)将为空

这意味着Groovy闭包将始终至少有一个参数,称为它(如果没有另外指定),如果没有作为参数给出,它将为null


第二个示例使用封闭闭包的作用域。

如果您定义这样的闭包

def closure = {println "i am a closure"}
它似乎没有参数,但实际上有一个名为
It
的隐式参数。这一点得到以下方面的证实:

def closure = {println "i am a closure with arg $it"}
closure("foo")
哪张照片

“我是arg foo的终结”

如果确实要定义采用0个参数的闭包,请使用以下方法:

def closure = {-> println "i am a closure"}
因此,您的示例可以改写为:

2.times {
   println it 

   mywith {->
      println it
   }
}

谢谢显式零参数闭包在mini-dsls中看起来不太好。因此我认为在这种情况下,在
mywith
嵌套闭包中打印的
it
变量是一个变量。
2.times {
   println it 

   mywith {->
      println it
   }
}