仅标量有时矮胖
a += b
到
a = a + b
但并非总是如此。例如,某些可变集合定义了+=
方法,而该方法变成了
a.+=(b)
这是行为
+=
上的a
方法确定? (包括此行为的其他示例吗?)
相关示例
改编自中的 Scala编程
var s = Set("a", "b")
s += "c"
在这种情况下,代码
s += "c"
的第二行实际上是以下代码的简写:
s = s + "c"
答案 0 :(得分:10)
在Scala中,何时+ = b变成a = a + b?
如果没有适用的+=
方法,则有 适用的+
方法,并且a
是可分配的(也就是说,它是{{1} }或使用var
方法。
或者如the spec所述:
如果满足以下两个条件,则会发生重新解释。
- 左侧
a_=
没有名为l
的成员,也不能通过隐式转换转换为名为+=
的成员的值。- 分配
+=
是类型正确的。特别是,这意味着l = l + r
指的是可以分配给它的变量或对象,并且可以转换为具有名为l
的成员的值。
这是行为
- 完全由a上是否有合适的+ =方法确定?
- 与对象是val还是var无关?
不完全是。如果有合适的+
方法,则无论任何其他因素(例如,+=
是可分配的)都将被调用。但是,如果没有,其他因素将决定它是否已废弃或收到错误消息。
请注意,您收到的错误消息与从经过废止的版本得到的错误消息不同:如果不存在废止要求的条件,则会收到一条错误消息,告诉您“ + =不是成员...”,并解释了为什么无法应用重复使用(例如“接收者不可分配”或如果a
会产生{错误)。
答案 1 :(得分:0)
在我的第一个回答中,我有点草率,我很抱歉。经过一番研究并更好地阅读了@ 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