Scala只有有时候会减糖

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是可分配的(也就是说,它是vara_=方法)。
或如the spec所述:

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

左侧的l没有名为+=的成员,也无法通过隐式转换将其转换为名为+=的成员的值。
分配l = l + r是类型正确的。特别是,这意味着l指的是可以分配给它的变量或对象,并且可以转换为具有名为+的成员的值。




这是行为吗

完全由a上是否有合适的+ =方法确定?
不依赖于对象是val还是var?


不完全的。如果有合适的+=方法,则无论任何其他因素(例如,可分配a),都将调用该方法。但是,如果没有,则由其他因素决定它是否已废弃或收到错误消息。
请注意,您收到的错误消息与从已废止版本得到的错误消息不同:如果不适用已废止废止的条件,则会收到一条错误消息,告诉您“ + =不是。的成员。 ”,并解释了为什么无法应用拒绝重复交易(例如“接收器不可分配”或如果a + b会产生类型错误,您将从a + b收到类型错误)。

10-02 03:13
查看更多