将闭包应用于groovy中的任意对象

时间:2014-02-10 07:33:55

标签: groovy gradle closures

在gradle中,有些地方可以使用生成器样式将闭包传递给对象本身,如下所示:

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

如何创建自己的自定义代码以将闭包应用于对象?有没有一种方法需要覆盖才能支持这个?

2 个答案:

答案 0 :(得分:3)

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

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

打印你好。

答案 1 :(得分:3)

添加海鸥提到的方式:

使用带闭包的方法:

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"}