匿名Scala函数中的块语句

时间:2016-09-14 21:24:22

标签: scala anonymous-function

我创建了这个简单的匿名函数

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

任何人都可以告诉我为什么会这样吗?

2 个答案:

答案 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中使用分号来了解更多信息。