是一个+ in + =在Map上的前缀运算符=?

时间:2010-05-06 07:30:03

标签: scala

在Martin Odersky的“Scala编程”一书中,第一章有一个简单的例子:

var capital = Map("US" -> "Washington", "France" -> "Paris")
capital += ("Japan" -> "Tokyo")

第二行也可以写成

capital = capital + ("Japan" -> "Tokyo")

我对+ =符号感到好奇。在Map类中,我没有找到+ =方法。我在自己的例子中能够采用相同的行为,比如

class Foo() {
    def +(value:String) = {
        println(value)
        this
    }
}

object Main {
  def main(args: Array[String]) = {
   var foo = new Foo()
   foo = foo + "bar"
   foo += "bar"
  }
}

我在问自己,为什么+ =符号是可能的。如果类Foo中的方法被称为test,则它不起作用。这导致我使用前缀表示法。分配符号(=)的+前缀表示法是?有人可以解释这种行为吗?

3 个答案:

答案 0 :(得分:9)

如果你有一个返回相同对象的符号方法,那么追加equals将执行操作和赋值(作为一个方便的快捷方式)。您也可以始终覆盖符号方法。例如,

scala> class Q { def ~#~(q:Q) = this }
defined class Q

scala> var q = new Q
q: Q = Q@3d511e

scala> q ~#~= q

答案 1 :(得分:5)

// Foo.scala
class Foo {
  def +(f: Foo) = this
}

object Foo {
  def main(args: Array[String]) {
    var f = new Foo
    f += f
  }
}

scalac -print Foo.scala的输出:

package <empty> {
  class Foo extends java.lang.Object with ScalaObject {
    def +(f: Foo): Foo = this;
    def this(): Foo = {
      Foo.super.this();
      ()
    }
  };
  final class Foo extends java.lang.Object with ScalaObject {
    def main(args: Array[java.lang.String]): Unit = {
      var f: Foo = new Foo();
      f = f.+(f)
    };
    def this(): object Foo = {
      Foo.super.this();
      ()
    }
  }
}

正如您所看到的,编译器只是将其转换为赋值和方法调用。

答案 2 :(得分:0)

+ =是一个运算符,默认实现使用+运算符。所以在大多数情况下,它已经完全符合您的要求。

相关问题