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
是可分配的(也就是说,它是var
或a_=
方法)。
或如the spec所述:
如果满足以下两个条件,则会发生重新解释。
左侧的l
没有名为+=
的成员,也无法通过隐式转换将其转换为名为+=
的成员的值。
分配l = l + r
是类型正确的。特别是,这意味着l
指的是可以分配给它的变量或对象,并且可以转换为具有名为+
的成员的值。
这是行为吗
完全由a上是否有合适的+ =方法确定?
不依赖于对象是val还是var?
不完全的。如果有合适的+=
方法,则无论任何其他因素(例如,可分配a
),都将调用该方法。但是,如果没有,则由其他因素决定它是否已废弃或收到错误消息。
请注意,您收到的错误消息与从已废止版本得到的错误消息不同:如果不适用已废止废止的条件,则会收到一条错误消息,告诉您“ + =不是。的成员。 ”,并解释了为什么无法应用拒绝重复交易(例如“接收器不可分配”或如果a + b
会产生类型错误,您将从a + b
收到类型错误)。