将带有 .& 运算符的参数传递给静态方法
Pass param with .& operator to a static method
使用 groovy .&
operator 可以创建对静态方法的引用,如
def static xyz( name='Joe' ) {
println "Hello ${name}"
}
// NOTE: ConsoleScript number part varies
def ref = ConsoleScript52.&xyz
并且可以在没有参数的情况下轻松调用,如
ref() // prints "Hello "
但是这个方法怎么可以带参数调用呢? ref('John')
报错groovy.lang.MissingMethodException: No signature of method: ConsoleScript52.xyz() is applicable for argument types: (java.lang.String) values: [John]
请注意,当使用 ref.
调用静态方法时,Groovy 在上面的示例中甚至不使用 name 参数的默认值
Groovy 是什么版本?这适用于 Groovy 2.4.5:
class Test {
static greet(name = 'tim') {
"Hello ${name.capitalize()}"
}
}
// regular static calls
assert Test.greet() == 'Hello Tim'
assert Test.greet('kaskelotti') == 'Hello Kaskelotti'
// Create a reference to the static method
def ref = Test.&greet
// Calling the reference works as well
assert ref() == 'Hello Tim'
assert ref('kaskelotti') == 'Hello Kaskelotti'
您可能正在使用一个 ConsoleScript
实例,其中您没有使用参数定义该方法。
在下面的代码中,在我的控制台 (ConsoleScript8
) 的第 8th 执行中,y 定义了不带参数的方法 hello()
(添加了 "script number" 明确表示):
println this.getClass().getName()
println ''
def static hello() {
println "(8) Hello"
}
def h8 = ConsoleScript8.&hello
h8()
h8('Joe')
并在下一次执行中产生以下结果:
ConsoleScript9
(8) Hello
Exception thrown
groovy.lang.MissingMethodException: No signature of method: ConsoleScript9.hello() is applicable for argument types: (java.lang.String) values: [Joe]
并且在第10次执行(ConsoleScript10
)我修改了它添加了默认参数:
println this.getClass().getName()
println ''
def static hello(name='amigo') {
println "(10) Hello ${name}"
}
def h10 = ConsoleScript10.&hello
h10()
h10('Joe')
println '--'
def h8 = ConsoleScript8.&hello
h8()
h8('Joe')
它产生:
ConsoleScript12
(10) Hello amigo
(10) Hello Joe
--
(8) Hello
Exception thrown
groovy.lang.MissingMethodException: No signature of method: ConsoleScript8.hello() is applicable for argument types: (java.lang.String) values: [Joe]
如果使用显式 class:
会更容易
class Greeter {
def static hello(name='Joe') {
"Hello ${name}"
}
}
def hi = Greeter.&hello
assert hi() == 'Hello Joe'
assert hi('Tom') == 'Hello Tom'
使用 groovy .&
operator 可以创建对静态方法的引用,如
def static xyz( name='Joe' ) {
println "Hello ${name}"
}
// NOTE: ConsoleScript number part varies
def ref = ConsoleScript52.&xyz
并且可以在没有参数的情况下轻松调用,如
ref() // prints "Hello "
但是这个方法怎么可以带参数调用呢? ref('John')
报错groovy.lang.MissingMethodException: No signature of method: ConsoleScript52.xyz() is applicable for argument types: (java.lang.String) values: [John]
请注意,当使用 ref.
调用静态方法时,Groovy 在上面的示例中甚至不使用 name 参数的默认值Groovy 是什么版本?这适用于 Groovy 2.4.5:
class Test {
static greet(name = 'tim') {
"Hello ${name.capitalize()}"
}
}
// regular static calls
assert Test.greet() == 'Hello Tim'
assert Test.greet('kaskelotti') == 'Hello Kaskelotti'
// Create a reference to the static method
def ref = Test.&greet
// Calling the reference works as well
assert ref() == 'Hello Tim'
assert ref('kaskelotti') == 'Hello Kaskelotti'
您可能正在使用一个 ConsoleScript
实例,其中您没有使用参数定义该方法。
在下面的代码中,在我的控制台 (ConsoleScript8
) 的第 8th 执行中,y 定义了不带参数的方法 hello()
(添加了 "script number" 明确表示):
println this.getClass().getName()
println ''
def static hello() {
println "(8) Hello"
}
def h8 = ConsoleScript8.&hello
h8()
h8('Joe')
并在下一次执行中产生以下结果:
ConsoleScript9
(8) Hello
Exception thrown
groovy.lang.MissingMethodException: No signature of method: ConsoleScript9.hello() is applicable for argument types: (java.lang.String) values: [Joe]
并且在第10次执行(ConsoleScript10
)我修改了它添加了默认参数:
println this.getClass().getName()
println ''
def static hello(name='amigo') {
println "(10) Hello ${name}"
}
def h10 = ConsoleScript10.&hello
h10()
h10('Joe')
println '--'
def h8 = ConsoleScript8.&hello
h8()
h8('Joe')
它产生:
ConsoleScript12
(10) Hello amigo
(10) Hello Joe
--
(8) Hello
Exception thrown
groovy.lang.MissingMethodException: No signature of method: ConsoleScript8.hello() is applicable for argument types: (java.lang.String) values: [Joe]
如果使用显式 class:
会更容易class Greeter {
def static hello(name='Joe') {
"Hello ${name}"
}
}
def hi = Greeter.&hello
assert hi() == 'Hello Joe'
assert hi('Tom') == 'Hello Tom'