【问题标题】:When does a += b become a = a + b in Scala?Scala 中的 a += b 何时变为 a = a + b?
【发布时间】:2019-01-27 20:11:54
【问题描述】:

仅 Scala 有时脱糖

a += b

a = a + b

但并非总是如此。例如,一些可变集合定义了一个+= 方法,而它变成了

a.+=(b)

这是行为吗

  1. 完全取决于a上是否有合适的+=方法? (包括这种行为还有其他例子吗?)
  2. 与对象是 val 还是 var 无关?

相关示例

改编自Scala 中的编程,在

var s = Set("a", "b")
s += "c"

在这种情况下,第二行代码s += "c" 本质上是以下的简写:

s = s + "c"

【问题讨论】:

  • 注意:“Scala”是什么/意思在 Scala 语言规范中定义。像您这样的问题总能在那里找到答案,而且它们根据定义是正确的答案。

标签: scala assignment-operator syntactic-sugar


【解决方案1】:

Scala 中的 a += b 什么时候变成 a = a + b?

当没有适用的+= 方法时,适用的+ 方法和a 是可分配的(即,它是一个var 或有一个a_= 方法)。

或者正如the spec 所说:

如果满足以下两个条件,就会发生重新解释。

  1. 左侧l 没有名为+= 的成员,也无法通过隐式转换转换为具有名为+= 的成员的值。
  2. 分配l = l + r 类型正确。特别是,这意味着l 指的是可以分配给的变量或对象,并且可以转换为具有名为+ 的成员的值。

这是行为吗

  1. 完全取决于a上是否有合适的+=方法?
  2. 与对象是 val 还是 var 无关?

不完全是。如果有合适的+= 方法,它将被调用而不管任何其他因素(例如a 是可分配的)。但如果没有,其他因素会决定它是脱糖还是您收到错误消息。

请注意,您收到的错误消息与从脱糖版本中收到的错误消息不同:当脱糖标准不适用时,您会收到一条错误消息,告诉您“+= 不是成员of ...”,以及为什么无法应用脱糖的解释(例如“接收器不可分配”或您从 a + b 得到的类型错误,如果 a + b 会产生类型错误)。

【讨论】:

    【解决方案2】:

    在我的第一个答案中,我有点草率,我很抱歉。经过一番研究并更好地阅读了@sepp2k的答案和评论后,我得出结论,Scala中的某些类实现了+=方法,而其他只是+方法,我在一些Scala代码中玩了一下例如:

      //Set, Int, Double, String implements the "+" method,
      //and then "+=" is syntactic sugar of a = a + b 
      var set = Set("a", "b")
      set += "c"
    
      var num = 3
      num += 2
    
      var str = "43"
      str += 5
    
      var l = List()
      l += "someString"
    
      // As you mention, MutableList implements "+=" method, and when you do
      // mutL += 4, is the same as call the method mutL.+=
      var mutL = new mutable.MutableList[Int]
      mutL += 4
    

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 1970-01-01
      • 2021-10-06
      • 2021-11-28
      • 2019-10-27
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 2017-01-21
      相关资源
      最近更新 更多