【问题标题】:+= operator in ScalaScala 中的 += 运算符
【发布时间】:2016-10-28 15:18:43
【问题描述】:

我正在阅读 M. Odersky 的 Programming in 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)包含此类运算符的所有定义等等。

我查看AnyRef希望找到,但找不到。

【问题讨论】:

    标签: scala operators


    【解决方案1】:

    += 和类似的运算符会被编译器脱糖,以防定义了 + 而没有定义 +=。 (同样适用于其他运算符。)检查 Scala 语言规范 (6.12.4):

    赋值运算符被特殊对待,因为它们可以 如果没有其他解释是有效的,则扩展到作业。

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

    l = l + r 除了计算操作的左侧 l 只有一次。

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多