代码之家  ›  专栏  ›  技术社区  ›  Mykola Golubyev

使用“it”的groovy嵌套闭包

  •  19
  • Mykola Golubyev  · 技术社区  · 15 年前

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

    8.times { println it }
    

    def mywith(Closure closure) {
       closure()
    }
    
    mywith { println it }
    

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

    2.times {
       println it 
    
       mywith {
          println it
       }
    }
    

    相反,我必须写

    2.times { i ->
       println i 
    
       mywith {
          println i
       }
    }
    

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

    2 回复  |  直到 8 年前
        1
  •  15
  •   Jaime Caffarel Daniel Koverman    8 年前

    我想这和 formal Closure definition Groovy:

    闭包可以有1…n个参数, 可以是静态类型的,或者 未键入的。第一个参数是 通过隐式非类型化提供 如果没有显式 参数已命名。如果呼叫者 不指定任何参数, 第一个参数(并且,通过扩展, 它)将为空。

    这意味着一个groovy闭包总是至少有一个参数,称为 (除非另有规定)和 如果不作为参数提供,则为空。

    第二个示例使用封闭闭包的范围。

        2
  •  21
  •   Dónal    15 年前

    如果你这样定义一个闭包

    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
       }
    }