【问题标题】:apply closure to an arbitrary object in groovy将闭包应用于 groovy 中的任意对象
【发布时间】:2014-03-07 10:34:52
【问题描述】:

在 gradle 中,您可以将闭包以构建器样式传递给对象本身,如下所示:

// ant is a property. an object.
ant {
    // do funky builder stuff
}

如何创建自己的自定义代码以将闭包应用于对象?有没有我需要重写的方法来支持这个?

【问题讨论】:

    标签: groovy gradle closures


    【解决方案1】:

    您可以覆盖call 运算符。 Groovy 允许您不在闭包参数周围放置圆括号。

    class A {
      def call(Closure cl) {
        print(cl())
      }
    }
    def a = new A();
    a {
        "hello"
    }
    

    打印你好。

    【讨论】:

      【解决方案2】:

      添加到海鸥提到的方式:

      使用带闭包的方法:

      class MyClass { 
        def ant (c) {
          c.call()
        }
      }
      
      def m = new MyClass()
      m.ant { 
        println "hello"
      }
      

      另一个,使用缺少方法,这在采用闭包的方法的名称方面提供了更大的灵活性(在您的情况下为ant):

      class A {
           def methodMissing(String name, args) {
              if (name == "ant") {
                  // do somehting with closure
                  args.first().call()
              }
          }
      }
      
      def a = new A()
      
      a.ant { println "hello"}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多