2010-05-06 22 views
7

Martin Odersky'den "Scala'da Programlama" adlı kitapta ilk bölümde basit bir örnek var:Harita üzerinde + = + = =?

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

İkinci satır

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

olarak da yazılabilir. = notasyon. Harita sınıfında bir + = yöntem bulunamadı. Aynı davranışı kendi

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

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

gibi kendi örneğimde yaptım. Kendimi sorguladım, neden + = notasyon mümkün. Örneğin, Foo sınıfındaki yöntem denenirse işe yaramaz. Bu beni ön ek gösterime yönlendiriyor. + Atama işareti için bir önek gösterimi mi (=)? Birisi bu davranışı açıklayabilir mi?

cevap

9

Aynı nesneyi döndüren sembolik bir yönteminiz varsa, eşittir ekleme işlemi işlemi ve atamayı gerçekleştirir (sizin için kullanışlı bir kısayol olarak). Ayrıca sembolik yöntemi her zaman geçersiz kılabilirsiniz. Örneğin, scalac -print Foo.scala ait

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

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

scala> q ~#~= q 
+0

çok teşekkürler. Cevabınız ile bunun da birden fazla karakter için çalıştığını öğrendim (~ ~ ~ gibi). – Steve

0

+ = varsayılan uygulamanın + operatörünü kullandığı bir operatördür. Yani çoğu durumda, zaten tam olarak ne istediğinizi yapar.

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

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

Çıktı:

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

Eğer derleyici sadece bir atama ve yöntemin bir çağrıya dönüştürür görebileceğiniz gibi.

İlgili konular