Closure getObject = { String oType ->
return {
type oType
format 'int32'
}
}
def yaml = new YamlBuilder()
yaml{
string 'value'
object1{
Closure type = getObject 'integer'
type.delegate = delegate
type()
}
object2{
Closure type = getObject 'long'
type.delegate = delegate
type()
}
}
println yaml.toString()
字符串
代码按预期工作并生成正确的yaml。
现在我想删除重复的代码行,并引入inflate()
方法:
def inflate( Closure closure, delegate ) {
closure.delegate = delegate
closure.resolveStrategy = Closure.DELEGATE_FIRST
closure()
}
型
这样我的DSL就更紧凑了
yaml{
string 'value'
object1{
inflate getObject( 'integer' ), delegate
}
object2{
inflate getObject( 'long' ), delegate
}
}
型
这导致了SOE:
java.lang.StackOverflowError
at Script1$_run_closure1$_closure3.doCall(Script1.groovy:5)
at Script1$_run_closure1$_closure3.doCall(Script1.groovy)
型
我错过了什么?
脚本可以用on appSpot播放
2条答案
按热度按时间baubqpgj1#
不是100%确定是怎么回事,但这似乎有效
字符串
ss2ws0br2#
事实证明,应该使用闭包而不是方法。
在这种情况下,闭包嵌套和重用不再是问题:
字符串
指纹
型
可运行代码is here