2010-05-06 5 views
7

In dem Buch „Programming in Scala“ von Martin Odersky gibt es ein einfaches Beispiel im ersten Kapitel:ist die + in + = auf einer Karte einen Präfix-Operator von =?

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

Die zweite Zeile auch als

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

geschrieben werden kann, ich bin neugierig über die + = Notation. In der Klasse Map habe ich keine + = Methode gefunden. Ich war in einem eigenen Beispiel auf das gleiche Verhalten der Lage, wie

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

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

Ich selbst bin in Frage zu stellen, warum die + = Notation möglich ist. Es funktioniert nicht, wenn die Methode in der Klasse Foo zum Beispiel test heißt. Dies führte mich zur Präfixnotation. Ist das + eine Präfixnotation für das Zuweisungszeichen (=)? Kann jemand dieses Verhalten erklären?

Antwort

9

Wenn Sie über eine symbolische Methode verfügen, die dasselbe Objekt zurückgibt, führt das Anfügen von equals die Operation und Zuweisung aus (als praktische Abkürzung für Sie). Sie können die symbolische Methode auch immer überschreiben. Zum Beispiel

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

scala> var q = new Q 
q: Q = [email protected] 

scala> q ~#~= q 
+0

Dank viel. Mit deiner Antwort habe ich auch gelernt, dass das für mehr als einen Charakter funktioniert (wie ~ # ~). – Steve

0

+ = ist ein Operator, wobei die Standardimplementierung des Operator + verwendet. In den meisten Fällen macht es also genau das, was Sie wollen.

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

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

Ausgabe von 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(); 
    () 
    } 
    } 
} 

Wie Sie den Compiler einfach konvertiert es in eine Zuordnung und ein Aufruf der Methode zu sehen.

Verwandte Themen