带有匿名函数和占位符的val和var的不同行为

时间:2019-03-15 12:16:06

标签: scala functional-programming anonymous-function

带有val和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)

最后一行带有var的错误消息:

  

';'预期但找到了标识符。

什么可以解释val和var变体之间的行为差​​异?

1 个答案:

答案 0 :(得分:16)

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

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

scala> var y: Int = _
y: Int = 0

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

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

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