在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,则它不起作用。这导致我使用前缀表示法。分配符号(=)的+前缀表示法是?有人可以解释这种行为吗?
答案 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)
+ =是一个运算符,默认实现使用+运算符。所以在大多数情况下,它已经完全符合您的要求。