我目前正在编写gradle构建脚本。什么是委托对象?何时使用它们?
class GroovyGreeter {
String greeting = "Default greeting"
def printGreeting(){println "Greeting: $greeting"}
}
def myGroovyGreeter = new GroovyGreeter()
myGroovyGreeter.printGreeting()
myGroovyGreeter.greeting = "My custom greeting"
myGroovyGreeter.printGreeting()
/*
The last Groovy feature we'll cover is that closures can have a delegate
object. Any variables or methods referenced in the closure that don't have a
local definition are then evaluated against the closure's delegate. Let's make
a closure that will access the property and method of our GroovyGreeter class.
*/
def greetingClosure = {
greeting = "Setting the greeting from a closure"
printGreeting()
}
//greetingClosure() // This doesn't work, because `greeting` isn't defined
greetingClosure.delegate = myGroovyGreeter
greetingClosure() // This works as `greeting` is a property of the delegate
请帮帮我。
当您将闭包的委托设置为另一个对象时,任何无法在闭包的范围内解决的对属性/方法的调用都将由闭包的委托来解决。在您的示例中,greeting
并且printGreeting
在greetingClosure
闭包范围内未定义
def greetingClosure = {
greeting = "Setting the greeting from a closure"
printGreeting()
}
因此,当您将此关闭的委托设置为的实例时 GroovyGreeter
greetingClosure.delegate = myGroovyGreeter
它们被此对象(成功)解析,因为它确实使用这些名称定义了属性和方法。
当您希望DSL /构建器的用户能够使用任何名称调用方法时,它们通常用于DSL或构建器中,并且该方法的名称几乎像其他方法参数一样在DSL中使用。采取以下使用构建器生成XML的示例
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.records() {
car(name:'HSV Maloo', make:'Holden', year:2006) {
country('Australia')
record(type:'speed', 'Production Pickup Truck with speed of 271kph')
}
}
def records = new XmlSlurper().parseText(writer.toString())
创建构建器之后,我们要做的第一件事是调用records
传递一个闭包参数。实际上,在records
任何地方都没有定义MarkupBuilder
带有闭包参数的方法,但是所有未定义的方法都将MarkupBuilder
使用Groovy的methodMissing
feature路由到。
在传递给它的闭包内,records
我们调用编译时未定义的各种其他方法,例如car
。这些方法调用如何解决MarkupBuilder
?因为此闭包的委托设置为MarkupBuilder
实例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句