Подтвердить что ты не робот

Метод передачи в качестве параметра в 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()

Это не работает с Нет такого свойства: bar для класса: Quux.

Если я изменяю метод на обертку bar в закрытии, он работает, но выглядит излишне подробным:

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

Есть ли более чистый способ?

4b9b3361

Ответ 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 вернет связанный метод, т.е. замыкание, которое вызывает method на obj.