Ale*_*ing 36 groovy monkeypatching
是否可以在Groovy中动态地向对象添加属性或方法?这是我到目前为止所尝试的:
class Greet {
def name
Greet(who) { name = who[0].toUpperCase() + [1..-1] }
def salute() { println "Hello $name!" }
}
g = new Greet('world') // create object
g.salute() // Output "Hello World!"
g.bye = { println "Goodbye, $name" }
g.bye()
Run Code Online (Sandbox Code Playgroud)
但我得到以下异常:
Hello World!
Caught: groovy.lang.MissingPropertyException: No such property: bye for class: Greet
Possible solutions: name
at test.run(greet.groovy:11)
Run Code Online (Sandbox Code Playgroud)
tim*_*tes 61
如果您只想将bye()方法添加到类的单个实例g,则Greet需要执行以下操作:
g.metaClass.bye = { println "Goodbye, $name" }
g.bye()
Run Code Online (Sandbox Code Playgroud)
否则,要添加bye()到所有实例Greet(从现在开始),请调用
Greet.metaClass.bye = { println "Goodbye, $name" }
Run Code Online (Sandbox Code Playgroud)
但是在创建Greet类的实例之前,您需要这样做
此外,您的构造函数中存在错误.你在你who面前失踪了[1..-1],如果构造函数的String长度小于2个字符,它将抛出异常
更好的版本可能是:
Greet( String who ) {
name = who.inject( '' ) { String s, String c ->
s += s ? c.toLowerCase() : c.toUpperCase()
}
}
Run Code Online (Sandbox Code Playgroud)
如评论中所述,
Greet( String who ) {
name = who.capitalize()
}
Run Code Online (Sandbox Code Playgroud)
是正确的方法
| 归档时间: |
|
| 查看次数: |
21385 次 |
| 最近记录: |