我正在使用以下代码与构建器:
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
}
}
这导致了国有企业:
java.lang.StackOverflowError
at Script1$_run_closure1$_closure3.doCall(Script1.groovy:5)
at Script1$_run_closure1$_closure3.doCall(Script1.groovy)
我错过了什么?
该脚本可以在appSpot上使用播放
不能 100% 确定发生了什么,但这似乎有效
Closure getObject = { String oType, del ->
{ ->
type oType
format 'int32'
}.tap {
it.delegate = del
it.resolveStrategy = Closure.DELEGATE_FIRST
}
}
def yaml = new YamlBuilder()
yaml{
string 'value'
object1{
getObject('integer', delegate)()
}
object2{
getObject('long', delegate)()
}
}