Scala 中的 a += b 何时变为 a = a + b?

Posted

技术标签:

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

仅 Scala 有时脱糖

a += b

a = a + b

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

a.+=(b)

这是行为吗

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

相关示例

改编自Scala 中的编程,在

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

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

s = s + "c"

【问题讨论】:

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

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

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

或者正如the spec 所说:

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

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

这是行为吗

    完全取决于a上是否有合适的+=方法? 与对象是 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

【讨论】:

以上是关于Scala 中的 a += b 何时变为 a = a + b?的主要内容,如果未能解决你的问题,请参考以下文章

怎么记住c语言中的何时用if(a==0)何时用if(a=0)?老忘记用a==0,谁能总结一下

scala中的println用于理解

Scala中的多个较低类型边界

Scala中的动态混合 - 有可能吗?

scala中的继承

如何获得字符串匹配的行数并将其添加为 Scala 中的新列?