[英]What does the `varName {` syntax mean in Groovy?
我對Groovy完全陌生,來自Java背景。 我正在嘗試學習它,因為Jenkins中的“作業DSL插件”已使用它。 我試圖理解第一步發布在插件主頁上的示例代碼片段。
這是他們的代碼片段供參考:
branches.each {
def branchName = it.name
job {
name "${project}-${branchName}".replaceAll('/','-')
scm {
git("git://github.com/${project}.git", branchName)
}
steps {
maven("test -Dproject.name=${project}/${branchName}")
}
}
}
我想了解的是job {
以上是什么意思。 我知道這將是一個Groovy Closure
但我不了解語法。 我閱讀的所有Groovy教程都使用了def job = {...}
(定義閉包)或job(...)
(稱為閉包)之類的語法。 這是其中之一的簡寫嗎? 像scm {
和steps {
這樣的其他實例如何工作?
如果您定義這樣的方法:
def job(Closure c) {
println c()
}
然后在Groovy中,您可以調用:
job({
"Hello World"
})
Groovy的解析器使您可以省略括號,這樣就可以變成:
job {
"Hello World"
}
您可能會看到的另一種形式遵循以下規則:如果CLosure是方法的最后一個參數,則可以在括號之外調用它,即:
def job(String who, Closure c) {
println c(who)
}
job("World") { who ->
"Hello $who"
}
就像提到的@tim_yates一樣,低級語法是closure
但是在更高級別,它可以被視為builder
-您可以在MarkupBuilder和JsonBuilder中找到很好的示例。
我對您使用的插件一無所知,而且對job
, scm
, steps
等是否已預定義,因為借助生成builder
,可以借助methodMissing
方法獲得預定義的方法名稱或動態方法名稱。
只是一個猜測,但可能在插件的內部實現中,有一個名為job
的方法可實例化一個對象,並根據傳入的closure
返回它。
BranchBuilder {
Branch branch
Branch job(Closure passedInClosure) {
branch = new Branch()
passedInClosure()
return branch
}
...
}
這個passedInClosure
將包含name
, scm
, steps
閉包,這取決於實現可能在BranchBuilder
存在:
void name(String branchName) {
branch.name = branchName
}
void scm(Closure passedInClosure) {
// the passedInClosure at this point contains the git closure which maybe isn't explicity defined
passedInClosure()
}
舉例說明在這種情況下methodMissing
如何工作(同樣在BranchBuilder
):
def methodMissing(String name, arguments) {
if(name == 'git') {
branch.scms << new SourceControl(system: 'Git', url: arguments[0], branchName: arguments[1])
} else if (name == 'svn') {
branch.scms << new SourceControl(system: 'Subversion', url: arguments[0], branchName: arguments[1])
}
}
在解釋這一點方面, Groovy Goodness網站做得比我更好,但是希望我能對它進行一些分解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.