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

时间:2013-03-05 18:54:08

标签: groovy functional-programming closures

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

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()

它失败,没有这样的属性:类吧:Quux

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

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

有更清洁的方式吗?

1 个答案:

答案 0 :(得分:57)

.&运营商拯救!

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将返回绑定方法,即在method上调用obj的闭包。