我创建了这个简单的匿名函数
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
任何人都可以告诉我为什么会这样吗?
答案 0 :(得分: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
答案 1 :(得分:5)
发生这种情况的原因是虽然Scala大多数时候都不需要使用分号(与Java不同),因为编译器更能用于推断语句/表达式的结束位置,如果你有2个语句/表达式在1行上,你需要为编译器分开它们。
你的第一个匿名函数有效,因为if(x % 2 == 0) x + 1 else x
是1个表达式。
编译器正在抱怨第二个,因为if(x % 2 == 0) println(x)
被认为是1个语句。因此,下一个语句开始,现在没有x
的上下文。
其他海报为您提供了一个解决方案,可以将函数的右侧分解为单独的语句,因此我不会复制 - 只需添加解释为什么编译错误发生,因为您说您正在学习语言。谷歌在Scala中使用分号来了解更多信息。