【问题标题】: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 定义)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2022-07-06
    • 1970-01-01
    • 2014-01-02
    • 2014-10-01
    • 1970-01-01
    • 2019-05-19
    相关资源
    最近更新 更多