在 Groovy 中将方法作为参数传递

Posted

技术标签:

【中文标题】在 Groovy 中将方法作为参数传递【英文标题】:Pass method as parameter in Groovy 【发布时间】:2013-02-20 07:50:39 【问题描述】:

有没有办法而不将其包装在闭包中?它似乎适用于函数,但不适用于方法。例如,给定以下内容:

def foo(Closure c) 
    c(arg1: "baz", arg2:"qux")


def bar(Map args) 
    println('arg1: ' + args['arg1'])
    println('arg2: ' + args['arg2'])

这行得通:

foo(bar)

但如果bar 是类中的方法:

class Quux  
    def foo(Closure c) 
        c(arg1: "baz", arg2:"qux")
    

    def bar(Map args) 
        println('arg1: ' + args['arg1'])
        println('arg2: ' + args['arg2'])
    

    def quuux()  
      foo(bar)
    
 

new Quux().quuux()

它失败了 No such property: bar for class: Quux

如果我将方法更改为将 bar 包装在一个闭包中,它可以工作,但似乎不必要地冗长:

    def quuux()  
      foo( args -> bar(args) )
    

有没有更清洁的方法?

【问题讨论】:

【参考方案1】:

.& 运营商来救援!

class Quux  
    def foo(Closure c) 
        c(arg1: "baz", arg2:"qux")
    

    def bar(Map args) 
        println('arg1: ' + args['arg1'])
        println('arg2: ' + args['arg2'])
    

    def quuux()  
      foo(this.&bar)
    
 

new Quux().quuux()
// arg1: baz
// arg2: qux

一般来说,obj.&method 将返回一个绑定方法,即在 obj 上调用 method 的闭包。

【讨论】:

甚至可以使用静态方法!谢谢

以上是关于在 Groovy 中将方法作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

在辅助方法中将 self 作为参数传递

在 Ruby 中将方法作为参数传递

如何在 Python 中将方法作为参数传递

如何在python类中将方法名称作为参数传递

在 Postman 中将类对象作为参数传递

在 PHP 中将实例方法作为参数传递