2009-10-06 21 views
2

在scala中可以在一個函數中定義一個本地塊。當地塊計算到最後一個語句,例如,scala中的「懸空」本地塊

val x = {val x =1;x+1} 

這裏x==2,內val x是局部的該塊。

但是,編寫匿名類時,這些局部塊可能會導致惡意的錯誤。例如(來自斯卡拉的參考)

new Iterator[Int] 
{...} // new anonymous class inheriting from Iterator[Int] 

new Iterator[Int] 

{...} //new Iterator[Int] followed by a "dangling" local block 

兩種情況的區別令人沮喪。 有時這兩個代碼片段可以編譯,例如,如果使用Iterator[Int],Range(0,1,1)而不是Iterator[Int]

我想到了它,並找不到需要「搖晃」本地塊(即,不使用值的本地塊)(或使代碼更優雅)的情況。

有沒有我們想要一個本地塊,而不使用它的值(並沒有把它放在一個不同的函數中並調用這個函數)的情況?我會爲例子感到高興。

如果不是這樣,我認爲這將是很好發出警告(甚至altogther禁止)每當scalac遭遇「晃來晃去」局部塊。我錯過了什麼嗎?

+2

這看起來更我喜歡的東西的結束帶來了對Scala的郵件列表不是堆棧討論溢出。 – 2009-10-06 15:05:55

+0

我考慮將它發佈到Scala郵件列表中,但由於我是scala/Java的新手,我想我可能在我對本地塊(在scala或普通FP中)的理解中錯過了一些補充,因此我決定檢查它首先在這裏。 – 2009-10-06 18:44:23

回答

3
{ 
    import my.crazy.implicit.functions._ 

    // use them... 
    } 

    // code I know isn't touched by them. 
5

爲什麼不寫

new Iterator[Int] { 
    ... 
} 

編輯: 這是Scala中使用的編程風格(見sample chapter pdf

new RationalTrait { 
    val numerArg = 1 * x 
    val denomArg = 2 * x 
} 

Java Coding Conventions

開括號「{」標誌出現在同一行聲明語句

+1

我與你同在! 一個好的代碼風格是非常重要的。 – Eastsun 2009-10-06 13:30:24

+0

我不喜歡這種編碼風格(在Java中,我在新行上放置了大括號),但是分號推理迫使我在Scala中使用它。用分號推斷! – starblue 2009-10-06 14:31:22