考虑以下来自 gradle 文档的示例(稍微简化):
task initConfig(type: Copy) {
from('src/main/config') {
include '**/*.properties'
include '**/*.xml'
filter(ReplaceTokens, tokens: [version: '2.3.1'])
}
}
这里,“from”方法在 AbstractCopyTask 类中声明,具有以下签名:
public AbstractCopyTask from(Object sourcePath, Closure c)
其中 c - 用于配置子 CopySourceSpec 的闭包。CopySourceSpec 是一个仅声明“from”方法的接口。
问题:为什么上面示例中的闭包允许调用“include”和“filter”方法,如果它是通过子 CopySourceSpec 的文档配置闭包只允许调用“from”方法?
该include
是从哪里来的AbstractCopyTask
父
例如,您可以在 groovy 中执行此操作:
class FromSpec {
String who
FromSpec(String who) {
this.who = who
}
def capitalize() {
who = who.capitalize()
}
}
class Testing {
FromSpec spec
def sayHello() {
println "Hello $spec.who"
}
def from(String who, Closure c) {
this.spec = new FromSpec(who)
c.delegate = this.spec
c.call()
}
def run(Closure c) {
c.delegate = this
c.call()
}
}
通过使用闭包委托,我们可以做到这一点
new Testing().run {
from('peshi') {
capitalize() // A method in the FromSpec
sayHello() // A method in the owner Testing class
}
}
我们得到输出
Hello Peshi
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句