メソッドをクロージャーでラップせずに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) })
}
よりクリーンな方法はありますか?
.&
オペレーターを助けてください!
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
を呼び出すクロージャを返します。