仅Scala 有时 desugars
a += b
至
a = a + b
但不总是。例如,一些可变集合定义了一个 +=
相反,它变成了
a.+=(b)
这是行为吗?
- 完全取决于是否有合适的
+=
方法 a
? (包括有这种行为的其他例子吗?)
- 独立于对象是val还是var?
相关的例子
改编自 在Scala中编程,在
var s = Set("a", "b")
s += "c"
在这种情况下,第二行代码 s += "c"
基本上是简写:
s = s + "c"
什么时候+ = b变成了Scala中的a = a + b?
什么时候没有适用 +=
方法,那里 是 适用的 +
方法和 a
是可分配的(也就是说,它是一个 var
或者有一个 a_=
方法)。
或者作为 规范 把它:
如果满足以下两个条件,则重新解释。
- 左手边
l
没有名为的成员 +=
,也无法通过隐式转换转换为具有名为的成员的值 +=
。
- 分配
l = l + r
是类型正确的。特别是这意味着 l
是指可以分配给的变量或对象,并且可以转换为具有名为的成员的值 +
。
这是行为吗?
- 完全取决于是否有合适的+ =方法?
- 独立于对象是val还是var?
不完全的。如果有合适的话 +=
无论其他因素如何,都会调用它 a
可转让)。但是当没有时,其他因素决定它是否被消除或者你得到错误信息。
请注意,您获得的错误消息与您从desugared版本获得的错误消息不同:当desugaring的标准不适用时,您会收到一条错误消息,告诉您“+ =不是...的成员。“,加上解释为什么不能应用desugaring(例如”接收器不可分配“或你从中得到的类型错误 a + b
如果 a + b
会产生类型错误)。
在我的第一个回答中,我有点仓促,道歉。经过一段时间的研究和更好的阅读@ 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