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

4uqofj5v  于 2022-11-01  发布在  其他
关注(0)|答案(2)|浏览(263)

在Groovy中,有没有一种方法可以将方法作为参数传递,而不用将其 Package 在闭包中?它似乎可以处理函数,但不能处理方法。例如,给定以下内容:

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 Package 在闭包中,它可以工作,但是看起来不必要地冗长:

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

有更干净的路吗?

k97glaaz

k97glaaz1#

.&操作员前来救援!

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

h5qlskok

h5qlskok2#

除了方法指针运算符(.&)之外,对于 *Groovy 3.0.0版和更高版本 *,还有等效的、兼容的、众所周知的Java 8+方法引用运算符(::)。

def foo(Closure c) {
    c(func: "foo")
}

def bar(Map args = [:]) {
    println "$args.func bar"
}

println foo(this::bar)

输出量:

foo bar

方法引用操作符,如Groovy文档中所述:
[...]与Groovy的方法指针操作符提供的功能有些重叠。实际上,对于动态Groovy,方法引用操作符只是方法指针操作符的别名。对于静态Groovy,该操作符产生的字节码类似于Java为相同上下文产生的字节码。

相关问题