具有匿名函数和占位符的 val 和 var 的不同行为
Different behavior of val and var with an anonymous function and a placeholder
带有 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 的最后一行的错误消息:
';' expected but identifier found.
什么可以解释 val 和 var 变体之间的行为差异?
在 Scala 中,下划线的用途之一是允许用户在 var
定义中设置默认初始值(参见 the spec 的第 4.2 节):
scala> var x: String = _
x: String = null
scala> var y: Int = _
y: Int = 0
您看到的问题似乎是 var
定义中紧跟在 =
之后的下划线被解释为这个特殊的默认初始值,并且替代地用作占位符不考虑功能。
在我看来,这种行为一定是一个错误。我很确定它不能被规范证明是合理的,并且期望编译器考虑 _
的两种语法用法似乎是非常合理的。不过,乍一看我无法提出问题。如果您关心,可以尝试自己报告。
由于您实际上并没有提出问题,我只是猜测哪些信息会对您有所帮助。您可能没有询问变通方法,因为您在第二行就有一个变通方法,所以您可能只是想知道这是怎么回事,在这种情况下,答案是 Scala 编译器仍然是一种越野车在某些方面一团糟,尤其是在语言中较少使用或关心的领域(如 var
定义)。
带有 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 的最后一行的错误消息:
';' expected but identifier found.
什么可以解释 val 和 var 变体之间的行为差异?
在 Scala 中,下划线的用途之一是允许用户在 var
定义中设置默认初始值(参见 the spec 的第 4.2 节):
scala> var x: String = _
x: String = null
scala> var y: Int = _
y: Int = 0
您看到的问题似乎是 var
定义中紧跟在 =
之后的下划线被解释为这个特殊的默认初始值,并且替代地用作占位符不考虑功能。
在我看来,这种行为一定是一个错误。我很确定它不能被规范证明是合理的,并且期望编译器考虑 _
的两种语法用法似乎是非常合理的。不过,乍一看我无法提出问题。如果您关心,可以尝试自己报告。
由于您实际上并没有提出问题,我只是猜测哪些信息会对您有所帮助。您可能没有询问变通方法,因为您在第二行就有一个变通方法,所以您可能只是想知道这是怎么回事,在这种情况下,答案是 Scala 编译器仍然是一种越野车在某些方面一团糟,尤其是在语言中较少使用或关心的领域(如 var
定义)。