2014-02-05 35 views
3

這證明是完全可以接受的編譯器(至少在2.10.3和2.11-M7):在Scala中,允許參數遮蔽的原因是什麼?

def foo(n: Int) = { 
    val n = 3 
    n * 3 
} 

...這可能是由於該參數的方法的範圍外存在/函數體,這是技術推理,但實際上,這可能會導致問題(正如我在現實生活中發現的代碼),所以我想知道這是否僅僅是語言設計的一個不可避免的後果,或者如果它實際上服務於一個真正的(更高的)目的。

P.S.它甚至OK使用不同類型的陰影名稱:

def foo(n: Int) = { 
    val n = "hello" 
    n * 3 
} 

注:現有的問題,提出了一個類似的,但還是概念上非常不同的問題:Why does Scala support shadow variables? - 即一個詢問的名字一般陰影,而我(意外地)發生了影響(事實上),而且沒有明顯的子範圍發生 - 是的,有大括號,但仍有一個(可以說)假定參數在相同的範圍內。

編輯: Haskell,示例或FP語言,也允許這:foo x = let x = 4 in x是完全合法的。

+1

我不明白爲什麼它不可能。充其量,編譯器可能會發出關於未使用參數的警告。另外,因爲你沒有明確地設置返回類型,編譯器只是從內部表達式中猜測它。 – Ashalynd

+1

@Ashalynd:我無處說明這是不可能的 - 恰恰相反:我在問**爲什麼編譯器默默地允許這樣的構造。此外,返回類型的推斷與問題完全無關。 –

+3

我不知道爲什麼...但是,如果這種行爲有點你,有一個'-Ywarn-shadowing'高級選項的scalac,至少應該警告你 –

回答

1

有時語言包含的功能不是因爲它們被認爲是好的和有用的,而是因爲沒有人考慮過。

相關問題