2008-10-08 24 views

回答

230

這是基本的腳本語法糖。省略了「高清」關鍵字把變量的綁定當前腳本和Groovy對待它(大多)像一個全球範圍的變量:

x = 1 
assert x == 1 
assert this.binding.getVariable("x") == 1 

使用def關鍵字,而不是不把腳本中的綁定變量:

def y = 2 

assert y == 2 

try { 
    this.binding.getVariable("y") 
} catch (groovy.lang.MissingPropertyException e) { 
    println "error caught" 
} 

版畫:「錯誤捕獲」

較大的程序中使用def關鍵字是非常重要的,因爲它有助於確定其中的變量可以被發現的範圍,可以幫助保護封裝。

如果你定義在你的腳本的方法,它不會有機會獲得了與「高清」在主腳本主體創建的變量,因爲它們不是在範圍:

x = 1 
def y = 2 


public bar() { 
    assert x == 1 

    try { 
     assert y == 2 
    } catch (groovy.lang.MissingPropertyException e) { 
     println "error caught" 
    } 
} 

bar() 

打印「出錯」

「y」變量不在函數內。 「x」在範圍內,因爲groovy會檢查變量的當前腳本的綁定。正如我剛纔所說,這簡直是語法糖做出快速和骯髒的腳本更快地輸入了(通常一個襯墊)。

較大腳本中的良好做法是始終使用「def」關鍵字,以免碰到奇怪的範圍問題或干擾您不想要的變量。

+10

好深入的答案!謝謝! – codeLes 2008-10-13 14:50:07

5

其實,我認爲這將具有相同的行爲...

變量Groovy中仍然需要申報,只是沒有輸入聲明,作爲右側通常包含足夠的信息對Groovy鍵入變量。

當我嘗試使用我還沒有高清或類型聲明的變量,我得到一個錯誤「沒有這樣的財產」,因爲它假設我使用包含代碼的類中的一員。

27

根據此pagedef是類型名稱的替代品,可以簡單地認爲是Object的別名(即表示您不關心該類型)。

34

Ted's answer非常適合腳本; Ben's answer是課程的標準。按照Ben的說法,將其視爲「對象」 - 但它更酷,因爲它不會限制您使用Object方法。這對進口產生了很好的影響。

例如在這個片段我不得不進口FileChannel

// Groovy imports java.io.* and java.util.* automatically 
// but not java.nio.* 

import java.nio.channels.* 

class Foo { 
    public void bar() { 
     FileChannel channel = new FileInputStream('Test.groovy').getChannel() 
     println channel.toString() 
    } 
} 

new Foo().bar() 

例如但在這裏我可以「翼它」只要一切都在classpath

// Groovy imports java.io.* and java.util.* automatically 
// but not java.nio.* 
class Foo { 
    public void bar() { 
     def channel = new FileInputStream('Test.groovy').getChannel() 
     println channel.toString() 
    } 
} 

new Foo().bar() 
+0

爲什麼你被允許'新的FileInputStream('Test.groovy')。getChannel()`沒有導入? – 2013-11-08 09:13:26

10

至於這個簡單的腳本是關心有沒有實際的區別。使用關鍵字定義

然而,變量「高清」被視爲局部變量,也就是當地的這一個腳本。第一次使用時,前面沒有「def」的變量存儲在所謂的綁定中。您可以將綁定看作是需要在「腳本之間」可用的變量和閉包的通用存儲區域。

所以,如果你有兩個腳本,並用相同的GroovyShell執行它們,第二個腳本就可以在第一時間拿到劇本中設置的所有變量沒有一個「高清」。

6

最重要的事情是,你真的真的不是每一個想創造意外的變量。在腳本中,可以在一個任務上創建變量,但是在生產代碼中,這是您遇到的最大的惡果之一。我不會考慮任何允許此構造在生產代碼中可用的語言。

我已經在多個使用visual basic的地方採訪過他們問過「什麼是VB文件中的第一行」的問題,如果您沒有回覆「OPTION EXPLICIT」,那麼採訪就停在那裏。 (顯式的選項不允許通過在VB中變量賦值的創建和迫使一個明確的「暗淡」)

這就是爲什麼它的壞的例子。這將運行(如果沒有失敗的斷言),如果你將以下代碼複製並粘貼到Groovy腳本:

bill = 7 
bi1l = bill + 3 
assert bill == 7 

它也消除了一些編譯器,以幫助您重構能力。例如,如果您重命名首次使用變量的地方,編譯器如何知道是否第二次使用(賦值)現在是錯誤而不是新變量?

垃圾一樣,這是太危險了。即使在你的生活中它只會咬你一次,它仍然會花費更多的時間,而不是在整個Carreer中明確聲明變量數千次。它也清楚地知道它在哪裏被刪除,你不必猜測。

在腳本中這是相當好的,因爲腳本的範圍是有限的,因爲他們重寫不重複使用和維護爲多,但允許在分配創造語言只是沒有準備好生產。