2016-09-15 35 views

回答

3

它的範圍不同。當您爲不帶「def」或其他類型的變量賦值時,在Groovy腳本中,它將被添加到腳本的全局變量「binding」中。這意味着它可以通過腳本中的所有函數進行訪問。這很像是你在腳本的頂部定義了變量。

如果在腳本上有多個線程正在進行操作,則可能會發生意外的行爲。

def a = { 
    x = 1 
    println x 
} 
def b = { 
    x = 2 
    println x 
} 
new Thread(a).start() 
new Thread(b).start() 

...可能會產生兩個,兩個或兩個混合。

相比之下,使用 「高清」 讓一個局部變量:

def a = { 
    def x = 1 
    println x 
} 
def b = { 
    def x = 2 
    println x 
} 
new Thread(a).start() 
new Thread(b).start() 

...總是打印1和2,以任意順序。

1

這是一個很好的問題,但它更多的是一個Groovy問題。

據我所知,定義一個沒有def關鍵字的變量將從腳本中工作,但如果您是在類方法中則不能。從這個實施例blog post

class MyTest { 
    def testMethod() { 
     y = 3 
     println y 
    }  
} 

t = new MyTest() 
t.testMethod() 

可變t將毫無問題地定義,但y定義將拋出異常。

這意味着在我們的上下文中(Jenkins管道),您始終可以在不使用def關鍵字的情況下定義變量,因爲您始終處於腳本上下文中,並且變量將被綁定到腳本。但是,我認爲使用def關鍵字是一種很好的做法,因爲它表明您知道何時實例化變量,並且還可以避免重複變量定義的某些問題(如果使用def關鍵字定義它們,至少編譯將失敗定義相同的變量兩次)。

最後,從Groovy documentation

當在Groovy使用閃避,實際類型持有人是Object(這樣你就可以 分配任何物體都以def定義的變量,並且如果返回任何一種 對象方法聲明返回def)。

所以你可能想具體指定你正在定義的變量的類型。你的情況,你可以定義cwd爲:

String cwd = pwd() 

它會禁止你做這樣的事情:

def cwd = pwd() 
cwd = 1000  // Valid code 

String cwd2 = pwd() 
cwd2 = 1000 // Will fail compilation 
相關問題