在方法中设置闭包的委托会导致SO

问题描述 投票:0回答:1

我正在使用以下代码与构建器

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上使用播放

groovy closures dsl
1个回答
0
投票

不能 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)()
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.