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?的主要内容,如果未能解决你的问题,请参考以下文章