Scala中的+ =运算符

时间:2016-06-26 15:12:09

标签: scala operators

我正在阅读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希望找到,但不能。

1 个答案:

答案 0 :(得分:9)

如果定义了+=且未定义+,编译器会对

+=和类似的运算符进行设防。 (同样适用于其他运营商。)检查Scala语言规范(6.12.4):

  

分配操作符被特别处理,因为它们可以   如果没有其他解释有效,则扩展到作业。

     

让我们在中缀操作中考虑赋值运算符,例如+ =   l + = r,其中l,r是表达式。这个操作可以   重新解释为对应于作业的操作

     除了评估操作的左侧l之外,

l = l + r   只有一次。

     

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

     

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

的成员的值