является + in + = на карте префиксным оператором =? - PullRequest
7 голосов
/ 06 мая 2010

В книге «Программирование в 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 ]

9 голосов
/ 06 мая 2010

Если у вас есть символический метод, который возвращает тот же объект, то добавление equals выполнит операцию и присваивание (в качестве удобного ярлыка для вас). Вы также можете всегда переопределить символический метод. Например,

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

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

scala> q ~#~= q
5 голосов
/ 06 мая 2010
// 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();
      ()
    }
  }
}

Как видите, компилятор просто преобразует его в присвоение и вызов метода.

0 голосов
/ 06 мая 2010

+ = является оператором, где реализация по умолчанию использует оператор +. Так что в большинстве случаев он уже делает именно то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...