roz*_*zer 4 groovy android gradle
我目前正在编写 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
Run Code Online (Sandbox Code Playgroud)
请帮帮我。
当您将闭包的委托设置为另一个对象时,任何对闭包范围内无法解析的属性/方法的调用都将由闭包的委托解析。在您的示例中,greeting和在闭包printGreeting范围内未定义greetingClosure
def greetingClosure = {
greeting = "Setting the greeting from a closure"
printGreeting()
}
Run Code Online (Sandbox Code Playgroud)
所以当你将这个闭包的委托设置为一个实例时GroovyGreeter
greetingClosure.delegate = myGroovyGreeter
Run Code Online (Sandbox Code Playgroud)
它们被该对象(成功)解析,因为它确实使用这些名称定义了属性和方法。
它们通常用在 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())
Run Code Online (Sandbox Code Playgroud)
创建构建器后我们要做的第一件事是调用records它并为其传递闭包参数。实际上并没有records在任何地方定义一个接受闭包参数的方法,但所有未定义的方法都将使用Groovy 的功能MarkupBuilder路由到。MarkupBuildermethodMissing
在传递给的闭包中,records我们调用编译时未定义的各种其他方法,例如car. 这些方法调用是如何解决的MarkupBuilder?因为这个闭包的委托被设置为MarkupBuilder实例。
| 归档时间: |
|
| 查看次数: |
1863 次 |
| 最近记录: |