24

我想定义一个闭包,它接受一个参数(我用 引用it)有时我想将另一个附加参数传递给闭包。我怎样才能做到这一点?

4

3 回答 3

42

您可以将第二个参数设置为默认值(例如 null):

def cl = { a, b=null ->
  if( b != null ) {
    print "Passed $b then "
  }
  println "Called with $a"
}

cl( 'Tim' )          // prints 'Called with Tim'
cl( 'Tim', 'Yates' ) // prints 'Passed Yates then Called with Tim

另一种选择是b像这样制作一个可变参数列表:

def cl = { a, ...b ->
  if( b ) {
    print "Passed $b then "
  }
  println "Called with $a"
}

cl( 'Tim' )                    // prints 'Called with Tim'
cl( 'Tim', 'Yates' )           // prints 'Passed [Yates] then Called with Tim
cl( 'Tim', 'Yates', 'Groovy' ) // prints 'Passed [Yates, Groovy] then Called with Tim
于 2012-09-25T09:54:30.853 回答
3

希望这会有所帮助

​def clr = {...a ->  
    print "Passed $a then "
    enter code here

}

​clr('Sagar')
clr('Sagar','Rahul')
于 2016-05-19T06:58:06.197 回答
0

@tim_yates的变体不适用于@TypeChecked(在类上下文中),至少Groovy 2.4.11在默认 arg 被忽略且无法编译的情况下:-(

因此,在这种情况下可行的其他(诚然丑陋的)解决方案是:

  1. 首先声明关闭似乎工作正常(无论如何都是递归所必需的):

    def cl
    cl = { ... }
    
    • 至少在 Eclipse Neon / Groovy-Eclipse Plugin 2.9.2 中,代码完成/建议在以后在同一代码块中使用闭包时都不起作用=>所以据我所知没有任何损失
  2. @TypeChecked(value=TypeCheckingMode.SKIP)它对两者都有效,但是你会放松对方法(或类,取决于你把它放在哪里)的类型检查

  3. 声明关闭委托cl2

    @TypeChecked
    class Foo { 
    
      static main( String[] args ) {
    
        def cl = { a, b ->
          if( b != null )
            print "Passed $b then "
          println "Called with $a"
        }
        def cl2 = { a -> cl( a, null ) }
    
        cl2( 'Tim' )         // prints 'Called with Tim'
        cl( 'Tim', 'Yates' ) // prints 'Passed Yates then Called with Tim           
      }
    }
    
  4. 闭包转换为类方法,例如

    @TypeChecked
    class Foo { 
    
      cl( a, b=null ) {
        if( b != null )
          print "Passed $b then "
        println "Called with $a"
      }
    
      static main( String[] args ) {
        cl( 'Tim' )          // prints 'Called with Tim'
        cl( 'Tim', 'Yates' ) // prints 'Passed Yates then Called with Tim           
      }
    }
    
于 2018-04-06T08:25:57.480 回答