在Gradle脚本中,我有一个带委托的Groovy闭包,我已经在该委托上创建了一个调用方法的函数,如下所述:
// Simplified example
ant.compressFiles() {
addFile(file: "A.txt")
addFile(file: "B.txt")
addAllFilesMatching("C*.txt", getDelegate())
}
def addAllFilesMatching(pattern, closureDelegate) {
// ...
foundFiles.each {
closureDelegate.addFile(file: it)
}
}
是否可以以更漂亮的方式执行此操作,而无需将委托传递给函数?例如,是否有可能以某种方式使用新方法扩展委托?
答案 0 :(得分:1)
这可以通过创建一个返回Closure
:
ant.compressFiles() addAllFilesMatching("A.txt", "B.txt", "C*.txt")
Closure addAllFilesMatching(String... patterns) {
// Calculate foundFiles from patterns...
return {
foundFiles.each { foundFile ->
addFile(file: foundFile)
}
}
}
答案 1 :(得分:0)
您可以先声明闭包,设置其delegate
,resolveStrategy
,然后将其传递给each
:
def addAllFilesMatching(pattern, delegate) {
def closure = {
addFile file: it
}
closure.delegate = delegate
closure.resolveStrategy = Closure.DELEGATE_FIRST
foundFiles = ["a.txt", "b.txt", "c.txt", "d.txt"]
foundFiles.each closure
}
答案 2 :(得分:0)
这个怎么样?
这是对WillP答案的一点修改(这绝对是正确的,并且应该采用的方式)并且应该更漂亮(根据您的要求),因为它使用闭包而不是方法。
def addAllFilesMatching = {pattern ->
// ... foundFiles based on pattern
foundFiles.each {
delegate.addFile(file: it)
}
}
ant.compressFiles() {
addFile(file: "A.txt")
addFile(file: "B.txt")
addAllFilesMatching.delegate = getDelegate()
addAllFilesMatching("C*.txt")
}