带有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变体之间的行为差异?
答案 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
定义)。