Different behavior of val and var with an anonymous function and a placeholder

gau*_*dey 6 functional-programming scala anonymous-function

Code with val and var:

val adder: Int => Int = _ + 3 // Works fine
var adder: Int => Int = (_ + 3) // Works fine
var adder: Int => Int = _ + 3 // Error (using var, but not brackets)
Run Code Online (Sandbox Code Playgroud)

Error message for the last line with var:

';' expected but identifier found.

What can explain the difference in behavior between the val and var variant?

Tra*_*own 16

在Scala中,下划线的用途之一是允许用户在var定义中设置默认的初始值(请参阅规范的 4.2节):

scala> var x: String = _
x: String = null

scala> var y: Int = _
y: Int = 0
Run Code Online (Sandbox Code Playgroud)

您看到的问题似乎是,紧接=var定义中的下划线会被解释为此特殊的默认初始值,并且不考虑在函数中用作占位符的替代方法。

在我看来,这种行为肯定是一个错误。我很确定规范不能证明它是合理的,并且期望编译器同时考虑的两种语法用法似乎很合理_。乍一看,我无法解决问题。如果您愿意,可以尝试自己报告。

由于您实际上并没有提出问题,所以我只是猜测哪些信息将对您有所帮助。您可能没有在问解决方法,因为您已经在第二行中找到了解决方法,所以您可能只是想知道这是怎么回事,在这种情况下,答案是Scala编译器仍然是越野车会以某种方式混乱,特别是在语言使用较少或不太关心的地方(如var定义)。