在下面的代碼段(從Groovy Semantics Manual page截取),爲什麼前綴與關鍵字DEF分配?Groovy的:什麼「高清X = 0」的「高清」的目的是什麼?
def x = 0
def y = 5
while (y-- > 0) {
println "" + x + " " + y
x++
}
assert x == 5
def關鍵字可被移除,並且該片段會產生相同的結果。那麼什麼是關鍵字高清的影響?
在下面的代碼段(從Groovy Semantics Manual page截取),爲什麼前綴與關鍵字DEF分配?Groovy的:什麼「高清X = 0」的「高清」的目的是什麼?
def x = 0
def y = 5
while (y-- > 0) {
println "" + x + " " + y
x++
}
assert x == 5
def關鍵字可被移除,並且該片段會產生相同的結果。那麼什麼是關鍵字高清的影響?
這是基本的腳本語法糖。省略了「高清」關鍵字把變量的綁定當前腳本和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」關鍵字,以免碰到奇怪的範圍問題或干擾您不想要的變量。
其實,我不認爲這將具有相同的行爲...
變量Groovy中仍然需要申報,只是沒有輸入聲明,作爲右側通常包含足夠的信息對Groovy鍵入變量。
當我嘗試使用我還沒有高清或類型聲明的變量,我得到一個錯誤「沒有這樣的財產」,因爲它假設我使用包含代碼的類中的一員。
根據此page,def
是類型名稱的替代品,可以簡單地認爲是Object
的別名(即表示您不關心該類型)。
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()
爲什麼你被允許'新的FileInputStream('Test.groovy')。getChannel()`沒有導入? – 2013-11-08 09:13:26
至於這個簡單的腳本是關心有沒有實際的區別。使用關鍵字定義
然而,變量「高清」被視爲局部變量,也就是當地的這一個腳本。第一次使用時,前面沒有「def」的變量存儲在所謂的綁定中。您可以將綁定看作是需要在「腳本之間」可用的變量和閉包的通用存儲區域。
所以,如果你有兩個腳本,並用相同的GroovyShell執行它們,第二個腳本就可以在第一時間拿到劇本中設置的所有變量沒有一個「高清」。
最重要的事情是,你真的真的不是每一個想創造意外的變量。在腳本中,可以在一個任務上創建變量,但是在生產代碼中,這是您遇到的最大的惡果之一。我不會考慮任何允許此構造在生產代碼中可用的語言。
我已經在多個使用visual basic的地方採訪過他們問過「什麼是VB文件中的第一行」的問題,如果您沒有回覆「OPTION EXPLICIT」,那麼採訪就停在那裏。 (顯式的選項不允許通過在VB中變量賦值的創建和迫使一個明確的「暗淡」)
這就是爲什麼它的壞的例子。這將運行(如果沒有失敗的斷言),如果你將以下代碼複製並粘貼到Groovy腳本:
bill = 7
bi1l = bill + 3
assert bill == 7
它也消除了一些編譯器,以幫助您重構能力。例如,如果您重命名首次使用變量的地方,編譯器如何知道是否第二次使用(賦值)現在是錯誤而不是新變量?
垃圾一樣,這是太危險了。即使在你的生活中它只會咬你一次,它仍然會花費更多的時間,而不是在整個Carreer中明確聲明變量數千次。它也清楚地知道它在哪裏被刪除,你不必猜測。
在腳本中這是相當好的,因爲腳本的範圍是有限的,因爲他們重寫不重複使用和維護爲多,但允許在分配創造語言只是沒有準備好生產。
好深入的答案!謝謝! – codeLes 2008-10-13 14:50:07