匿名 Scala 函数中的块语句

Block statements in anonymous Scala function

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

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

而且效果很好。之后,我尝试在 if 之后和 x+1 语句之前添加另一个语句。

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

然后我收到以下编译器错误

Cannot resolve symbol x

谁能告诉我为什么会这样?

用这个。您需要大括号来表示这些是多行:

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

发生这种情况的原因是尽管 Scala 大多数时候不需要使用分号(与 Java 不同),因为编译器更有能力推断 statements/expressions 结束的位置,如果你在 1 行有 2 statements/expressions 那么你需要为编译器将它们分开。

你的第一个匿名函数可以工作,因为 if(x % 2 == 0) x + 1 else x 是 1 个表达式。

编译器抱怨第二个,因为 if(x % 2 == 0) println(x) 被认为是 1 条语句。因此,下一条语句开始,现在 x.

没有上下文

其他发布者为您提供了将函数右侧分解为单独语句的解决方案,因此我不会重复 - 只是添加解释为什么会出现编译错误,因为您说您正在学习该语言. Google关于在 Scala 中使用分号以了解更多信息。