2011-08-11 72 views
5

我認爲影子變量太危險了,無法使用它們。爲什麼Scala支持這種語言結構?應該有一些強有力的理由,但我無法找到它。爲什麼Scala支持陰影變量?

+1

我想知道同樣的事情。也許Odersky等人沒有考慮就把這個行爲從Java轉向了Java。 – laher

+0

我相信Odersky先生對於任何特定語言結構的決定都有一定的動機。 :) –

+0

:)足夠公平。我猜他認爲編譯器警告就足夠了。我可以看到scalac需要編譯器選項-Ywarn-shadowing,所以IDE可能也支持它。 – laher

回答

20

正如提醒:變量,方法或類型被稱爲shadow當它在內部範圍中聲明時,它的另一個變量,方法或類型相同,因此無法引用外部以非限定的方式(或者有時甚至完全)使用範圍實體。像Java一樣,Scala允許陰影。

我可以看到的一個可能的原因是,在Scala中,有很多嵌套的作用域,每個作用域都比較短(與Java或C++相比)。事實上,塊可以在任何需要表達的地方開始,因此開始一個新的範圍。因此,在內部範圍內使用陰影名稱平均而言更接近他們的聲明並且不太模糊。

此外,內聯關閉通常會導致程序員在已經擁擠的作用域中需要新的變量名稱。允許陰影還允許繼續使用描述性名稱,即使它們與已經使用過的名稱相同,而不是發明其他奇怪的名稱 - 例如用my,local或(更糟糕的)_或單一的 - 字母名稱...

陰影變得不那麼好的IDE的問題,它可以例如在源代碼中突出顯示光標下變量的聲明和引用。

只是我的兩分錢在這裏...

+1

感謝您提供我未提供的詳細回覆和提醒。 我想過在閉包環境中的變量陰影。你是對的,有些開發人員可能會在封閉的範圍內使用相同的名稱,而不是提供一些新名稱。我想這些開發人員只是覺得它在使用上更加舒適。但這不是隱藏的威脅嗎?我同意短範圍變量名稱的前綴看起來不太完美。但它使代碼在大多數情況下更容易理解(特別是對於Scala新手)。如我錯了請糾正我。 –

18

我認爲影子變量是太危險使用它們。

您有權隨心所欲地想。但是,由於您沒有提供任何數據,研究或甚至是原因,該意見沒有價值。

爲什麼Scala支持這種語言結構?

因爲它很有用。程序員不需要發明任意的標識符名稱,只是因爲某些標識符已經在使用它了。

它使得通配符導入更加有用,因爲它消除了因爲第三方添加了標識符而導致編譯中斷的可能性。

應該有一些強有力的理由,但我無法找到它。

爲什麼要有強有力的理由呢?它有其優點,並且在沒有缺點的情況下(你沒有提交),這就足夠了。

編輯

在回答缺點解釋,我必須說,是陰影的一個特例。通過import語句或嵌套package語句以及同一包中的所有內容,陰影還會影響導入中的所有內容。

讓我們看一些例子:

// Not allowed, because it shadows List 
import java.util._ 

class A { 
    // Not allowed, because it shadows this, hashCode, equals, toString 
    class B 
} 

這將使一個很煩人的語言。

+1

影子變量的危險性太明顯,無法在最初的問題中描述。順便說一句**我有**在關於讓 - 菲利普的回答的評論中寫過(可能你還沒看過)。但特別爲你,我會重複。 –

+4

當某人在某個範圍內聲明瞭一個變量,並且該變量與外部範圍中的另一個變量名稱相同時,他或她會使代碼更加複雜。跟蹤每個變量的含義要困難得多。下面是'Scala編程'的一個很好的引用:「請記住,這樣的代碼可能會讓讀者感到困惑,因爲變量名在嵌套作用域中採用了新的含義,通常選擇一個新的有意義的變量名以遮蔽外部變量「。 –

+0

@keykeeper好吧,我對這個論點作了回答。 –