我正在阅读M. Odersky的Scala编程,现在我正试图理解运算符的含义。据我所知,Scala中的任何运算符都只是一种方法。请考虑以下示例:
class OperatorTest(var a : Int) {
def +(ot: OperatorTest): OperatorTest = {
val retVal = OperatorTest(0);
retVal.a = a + ot.a;
println("=")
return retVal;
}
}
object OperatorTest {
def apply(a: Int) = new OperatorTest(a);
}
在这种情况下,我们在此类中只定义了+运算符。如果我们输入类似的内容:
var ot = OperatorTest(10);
var ot2 = OperatorTest(20);
ot += ot2;
println(ot.a);
然后
=+
30
将是输出。所以我假设对于Scala中的每个类(或类型?),我们为+=
定义了a += b iff a = a + b
运算符。但是因为每个运算符只是一个方法,其中+ =运算符定义了?也许有一些类(如Java中的Object
)包含此类运算符的所有defenition等等。
我看着AnyRef
希望找到,但不能。
答案 0 :(得分:9)
+=
且未定义+
,编译器会对 +=
和类似的运算符进行设防。 (同样适用于其他运营商。)检查Scala语言规范(6.12.4):
分配操作符被特别处理,因为它们可以 如果没有其他解释有效,则扩展到作业。
让我们在中缀操作中考虑赋值运算符,例如+ = l + = r,其中l,r是表达式。这个操作可以 重新解释为对应于作业的操作
除了评估操作的左侧l之外,l = l + r 只有一次。
如果满足以下两个条件,则会重新解释 满足。
左侧l没有名为+ =的成员,也不能 通过隐式转换转换为具有名为的成员的值 + =。赋值l = l + r是类型正确的。特别是这意味着l指的是可以分配给的变量或对象, 并且可以转换为名为+。
的成员的值