2010-05-06 24 views
7

Trong cuốn sách "Lập trình trong Scala" từ Martin Odersky có một ví dụ đơn giản trong chương đầu tiên:là dấu + trong + = trên toán tử tiền tố Bản đồ của =?

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

Dòng thứ hai cũng có thể được viết như

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

Tôi tò mò về + = ký hiệu. Trong lớp Bản đồ, tôi không tìm thấy phương thức + =. Tôi có thể thực hiện hành vi tương tự trong ví dụ của riêng mình như

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

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

Tôi tự hỏi mình, tại sao ký hiệu + = là có thể. Nó không hoạt động nếu phương thức trong lớp Foo được gọi là kiểm thử chẳng hạn. Điều này dẫn tôi đến ký hiệu tiền tố. Là ký hiệu tiền tố + cho dấu chỉ định (=)? Ai đó có thể giải thích hành vi này?

Trả lời

9

Nếu bạn có một phương thức tượng trưng trả về cùng một đối tượng, sau đó chắp thêm bằng sẽ thực hiện thao tác và gán (dưới dạng phím tắt tiện dụng cho bạn). Bạn cũng có thể luôn ghi đè phương pháp tượng trưng. Ví dụ,

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

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

scala> q ~#~= q 
+0

cảm ơn rất nhiều. Với câu trả lời của bạn, tôi cũng học được rằng điều này làm việc cho nhiều hơn một nhân vật (như ~ # ~). – Steve

0

+ = là toán tử, nơi triển khai mặc định sử dụng toán tử +. Vì vậy, trong hầu hết các trường hợp, nó đã làm chính xác những gì bạn muốn.

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

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

Sản lượng 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(); 
    () 
    } 
    } 
} 

Như bạn có thể thấy các trình biên dịch chỉ đơn giản là chuyển đổi nó để chuyển nhượng và một cuộc gọi của phương pháp.

Các vấn đề liên quan