簡體   English   中英

Groovy中的“ varName {”語法是什么意思?

[英]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 -您可以在MarkupBuilderJsonBuilder中找到很好的示例。

我對您使用的插件一無所知,而且對jobscmsteps等是否已預定義,因為借助生成builder ,可以借助methodMissing方法獲得預定義的方法名稱或動態方法名稱。

只是一個猜測,但可能在插件的內部實現中,有一個名為job的方法可實例化一個對象,並根據傳入的closure返回它。

BranchBuilder {
    Branch branch

    Branch job(Closure passedInClosure) {
        branch = new Branch()
        passedInClosure()
        return branch
    }

    ...
}

這個passedInClosure將包含namescmsteps閉包,這取決於實現可能在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM