2017-10-04 76 views
1

這是一個命令模式來編寫詹金斯管道這樣的代碼:爲什麼jenkinsfile以這種方式使用閉包?

def call(body) {  
    def config = [:] 
    body.resolveStrategy = Closure.DELEGATE_FIRST 
    body.delegate = config 
    body() 
} 

我不知道怎樣來寫這個簡單,但這種封閉得到隱含的進口,並且可以通過.groovy文件的文件名被稱爲它生活在

我這樣稱呼它:

MyClosure { myarg = 'sdfsdf' } 

我不能完全肯定這是什麼做的。這是做call(body),然後分配body作爲代表。所以這意味着我通過它的關閉是代表,但是不僅僅是主人?華?我困惑。

回答

3

運行時,它將創建一個空映射(config)。然後它通過設置其resolveStrategy爲常量Closure.DELEGATE_FIRST來告訴關閉(body)首先查看代理以查找屬性。然後它將config映射指定爲正文對象的委託。

現在,當您執行body()閉包時,變量的作用域爲config映射,因此現在爲config.myarg = 'sdfsdf'

現在後面的代碼中,您可以輕鬆訪問config中的值映射。

body所有者,默認情況下是委託。但是當您將代理切換爲config,並且告訴它首先使用委託時,您將獲得變量config的範圍。

+0

如果我沒有將代理切換到配置會怎樣?身體將是代表?如果是這種情況,我將無法訪問傳入的myarg? – red888

+0

對。 'body'是一個指向匿名函數的變量。如果你沒有改變委託,那麼myarg會在該函數的範圍內被設置爲'sdfsdf',並且只要該函數退出,該值就消失了。但是,如果您委託給地圖對象,它將在該對象上設置屬性,您現在可以獲取該屬性。 –

+1

其實身體不指向一個功能。這是關閉的一個實例。 – Opal

相關問題