2016-09-14 45 views
1

我創建這個簡單的匿名函數塊報表功能

var b = (x : Int) => if(x % 2 == 0) x + 1 else x 

和它的偉大工程。之後,我試圖在x+1聲明之後和之後添加另一個聲明。

var b = (x : Int) => if(x % 2 == 0) println(x) x + 1 else x 

和這一點上我收到以下編譯器錯誤

無法解析符號x

請任何人都可以讓我知道爲什麼出現這種情況?

回答

5

原因發生這種情況的原因是,雖然Scala在大多數情況下不需要使用分號(與Java不同),但由於編譯器能夠更好地推斷語句/表達式結束的位置,因此如果在一行中有2個語句/表達式,那麼您需要將它們分開以供編譯器使用。

因爲if(x % 2 == 0) x + 1 else x是1表達式,所以您的第一個匿名函數可以工作。

編譯器抱怨第二個,因爲if(x % 2 == 0) println(x)被視爲1聲明。因此,下一個聲明開始,並且現在沒有x的上下文。

其他海報已經給你一個解決方案,將功能的右側分解成單獨的語句,所以我不會重複 - 只是添加一個解釋爲什麼編譯錯誤發生,因爲你說你正在學習語言。谷歌關於在Scala中使用分號來了解更多信息。

5

使用此。您需要在大括號來表示這些都是多行:

var b = (x : Int) => if(x % 2 == 0) { 
    println(x) 
    x + 1 
} else x 

或者你也可以做到這一點..你需要把那個分號以指示編譯它們是獨立的語句:

var b = (x : Int) => if(x % 2 == 0) { println(x); x + 1 } else x