在 Scala 中,a += b 何时变成 a = a + b?

When does a += b become a = a + b in Scala?

提问人:joel 提问时间:8/21/2018 最后编辑:joel 更新时间:8/22/2018 访问量:247

问:

Scala 有时只会脱糖

a += b

a = a + b

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

a.+=(b)

这种行为是

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

相关示例

改编自 Programming in Scala,在

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

在本例中,第二行代码实质上是以下项的简写:s += "c"

s = s + "c"
scala 赋值-运算符 语法-糖

评论

1赞 Jörg W Mittag 8/22/2018
注意:“Scala”是什么/是什么意思在 Scala 语言规范中定义。像你这样的问题的答案总是可以在那里找到,根据定义,它们是正确的答案。

答:

12赞 sepp2k 8/21/2018 #1

在 Scala 中,a += b 何时变成 a = a + b?

当没有适用的方法时,有一个适用的方法并且是可分配的(即,它是一个或有一个方法)。+=+avara_=

或者正如规范所说

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

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

这种行为是

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

差一点。如果有合适的方法,则无论任何其他因素(例如可分配性),都将调用它。但是,如果没有,其他因素将决定它是否脱糖或您收到错误消息。+=a

请注意,您收到的错误消息与您从脱糖版本收到的错误消息不同:当脱糖条件不适用时,您会收到一条错误消息,告诉您“+= 不是 ...”的成员,以及无法应用脱糖的原因(例如“接收器不可分配”或如果会产生类型错误,则会出现类型错误)。a + ba + b

0赞 developer_hatch 8/22/2018 #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