首页 文章

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

提问于
浏览
33

有没有办法在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()

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

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

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

有更干净的方式吗?

1 回答

  • 55

    .& 运营商来救援!

    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 的闭包 .

相关问题