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