web-dev-qa-db-ja.com

Groovyのパラメーターとしてメソッドを渡す

メソッドをクロージャーでラップせずに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) })
    }

よりクリーンな方法はありますか?

38
David Moles

.&オペレーターを助けてください!

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を呼び出すクロージャを返します。

62
epidemian