我創建這個簡單的匿名函數塊報表功能
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
請任何人都可以讓我知道爲什麼出現這種情況?
我創建這個簡單的匿名函數塊報表功能
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
請任何人都可以讓我知道爲什麼出現這種情況?
原因發生這種情況的原因是,雖然Scala在大多數情況下不需要使用分號(與Java不同),但由於編譯器能夠更好地推斷語句/表達式結束的位置,因此如果在一行中有2個語句/表達式,那麼您需要將它們分開以供編譯器使用。
因爲if(x % 2 == 0) x + 1 else x
是1表達式,所以您的第一個匿名函數可以工作。
編譯器抱怨第二個,因爲if(x % 2 == 0) println(x)
被視爲1聲明。因此,下一個聲明開始,並且現在沒有x
的上下文。
其他海報已經給你一個解決方案,將功能的右側分解成單獨的語句,所以我不會重複 - 只是添加一個解釋爲什麼編譯錯誤發生,因爲你說你正在學習語言。谷歌關於在Scala中使用分號來了解更多信息。
使用此。您需要在大括號來表示這些都是多行:
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