【问题标题】:Groovy DSL: How to hide closure parameter?Groovy DSL:如何隐藏闭包参数?
【发布时间】:2014-01-24 15:08:15
【问题描述】:

我正在尝试使用 Groovy 实现一个迷你 DSL:

def parent(closure){
    def container = new ArrayList<>()
    closure.call(container)
    container
}

def child(element, parent) {
    println "add child$element to parent"
    parent.add(element)
}

parent{ it->
    child(1, it)
    child(2, it)
}

但是我想去掉it参数让它看起来更好看,像这样:

parent{ 
    child(1)
    child(2)
}

这样可以吗? 非常感谢。

【问题讨论】:

    标签: groovy metaprogramming dsl


    【解决方案1】:

    这不是一个完整的解决方案,只是一个例子,但我认为,你应该这样做:

    class Parent{
        def container = new ArrayList<>()
        def child(element) {
            println "add child$element to parent"
            container.add(element)
        }
    
        def parent(Closure closure){
            closure.delegate = this
            closure.resolveStrategy = Closure.DELEGATE_FIRST
            closure.call()
            container
        }
    }
    
    
    new Parent().parent {
        child(1) // Here we are trying to resolve child method in our delegate, then owner.
        child(2)
    }
    

    当然,您以后可以删除新的 Parent,这只是一个简单的例子,向您展示委托的魔力。

    【讨论】:

      【解决方案2】:

      如果您不想为其创建一个完整的单独类,可以在脚本中使用@FieldAST:

      import groovy.transform.Field
      
      @Field ArrayList container = new ArrayList<>()
      
      //or just list
      //@Field def container = []
      
      def parent(Closure closure){
          closure.call()
          container
      }
      
      def child(element) {
          println "add child$element to parent"
          container << element
      }
      
      parent {
          child(1)
          child(2)
      }
      

      【讨论】:

        猜你喜欢
        • 2017-09-04
        • 1970-01-01
        • 2017-06-08
        • 2016-09-29
        • 2016-10-20
        • 2012-07-14
        • 2018-11-22
        • 1970-01-01
        • 2013-08-29
        相关资源
        最近更新 更多