我有一个关闭作为委托对另一个Groovy对象执行。我能做到:
foo {
bar {
major = 1
}
}
但是当我这样做时:
foo {
bar {
major 1
}
}
我收到错误:
> No signature of method: my.Bar.major() is applicable for argument types (java.lang.Integer) values: [1]
Possible solutions: setMajor(java.lang.Integer), getMajor(), wait(), any(), setMajor(java.lang.String), wait(long)
Bar看起来像:
class Bar {
Integer major
Integer getMajor() { return this.major }
def setMajor(Integer val) { this.major = val }
}
我认为Groovy在处理属性引用时使getter / setter透明,并且引用bar.major
与bar.get/setMajor()
相同。我是否理解这个错误,或者当您将Closure
个委托投入混合时,元类查找路由是否有所不同?解决方案策略为DELEGATE_FIRST
。
答案 0 :(得分:1)
您还必须添加void major(Integer val)
。 major = 1
setMajor(1)
是major 1
的常规短片,major(1)
是println "Hello world"
System.out.println "Nice cheese Gromit!"
的缩写。 (见Section Optional parenthesis)
可选括号
如果至少有一个参数并且没有歧义,Groovy中的方法调用可以省略括号。
class X { Integer major void major(Integer m) { major = m } } def x = new X() x.major = 1 // x.setMajor(1) assert x.major==1 // x.getMajor()==1 x.major 2 // x.major(2) assert x.major==2
E.g:
methodMissing
如果您需要此行为,可以为此案例添加class X {
Integer major
def methodMissing(String name, args) {
if (this.hasProperty(name) && args.size()==1) {
this."$name" = args[0]
} else {
throw new MissingMethodException(name, this.class, args)
}
}
}
def x = new X()
x.major = 1
assert x.major==1
x.major 2
assert x.major==2
。 E.g:
{{1}}