提问人:joel 提问时间:8/21/2018 最后编辑:joel 更新时间:8/22/2018 访问量:247
在 Scala 中,a += b 何时变成 a = a + b?
When does a += b become a = a + b in Scala?
问:
Scala 有时只会脱糖
a += b
自
a = a + b
但并非总是如此。例如,一些可变集合定义了一个方法,而它变成了+=
a.+=(b)
这种行为是
- 完全取决于是否有合适的方法?(包括这种行为还有其他例子吗?
+=
a
- 与对象是 val 还是 var 无关?
相关示例
改编自 Programming in Scala,在
var s = Set("a", "b")
s += "c"
在本例中,第二行代码实质上是以下项的简写:
s += "c"
s = s + "c"
答:
12赞
sepp2k
8/21/2018
#1
在 Scala 中,a += b 何时变成 a = a + b?
当没有适用的方法时,有一个适用的方法并且是可分配的(即,它是一个或有一个方法)。+=
+
a
var
a_=
或者正如规范所说:
如果满足以下两个条件,则会发生重新解释。
- 左侧没有名为 的成员,也无法通过隐式转换为具有名为 的成员的值。
l
+=
+=
- 赋值是类型正确的。具体而言,这意味着它指的是可以赋值给的变量或对象,并且可以转换为具有名为 的成员的值。
l = l + r
l
+
这种行为是
- 完全取决于 A 上是否有合适的 += 方法?
- 与对象是 val 还是 var 无关?
差一点。如果有合适的方法,则无论任何其他因素(例如可分配性),都将调用它。但是,如果没有,其他因素将决定它是否脱糖或您收到错误消息。+=
a
请注意,您收到的错误消息与您从脱糖版本收到的错误消息不同:当脱糖条件不适用时,您会收到一条错误消息,告诉您“+= 不是 ...”的成员,以及无法应用脱糖的原因(例如“接收器不可分配”或如果会产生类型错误,则会出现类型错误)。a + b
a + 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
评论