2009-03-25 27 views
9

Tôi vừa phát hiện ra cú pháp này cho một scala Map (sử dụng ở đây trong có thể thay đổi hình thức)Scala Bản đồ: đường cú pháp bí ẩn?

val m = scala.collection.mutable.Map[String, Int]() 
m("Hello") = 5 
println(m) //PRINTS Map(Hello -> 5) 

Bây giờ tôi không chắc chắn cho dù đây là cú pháp đường tích hợp sẵn trong ngôn ngữ, hay một cái gì đó cơ bản hơn đang diễn ra ở đây liên quan đến thực tế là một bản đồ mở rộng một PartialFunction. Bất cứ ai có thể giải thích?

Trả lời

14

Nếu bạn có ý nghĩa (nó sẽ được tốt đẹp nếu bạn có thể rõ ràng hơn)

m("Hello") = 5 

đó là dự định cú pháp đường cho

m.update("Hello", 5) 

không phụ thuộc vào những gì m là. Điều này giống như

m("Hello") 

đó là cú pháp đường cho

m.apply("Hello") 

(Tôi chỉ đọc "Lập trình trong Scala".)

+0

Bạn có thể trỏ tôi đến trang trong Lập trình ở Scala hay không; trừ khi tôi bị mù tôi không thể tìm thấy nó. Tôi thực sự không tin rằng đây là cú pháp đường ở tất cả các –

+0

Bạn có thể chỉ ra nơi phương thức "cập nhật" nằm trong hệ thống phân cấp không? Tôi thậm chí không thể tìm thấy nó! –

+3

Nó ở trang 40. – starblue

5

@starblue là chính xác. Lưu ý rằng bạn cũng có thể làm những thứ khá sáng tạo với update chẳng hạn như giá trị trả lại khác so với những gì được chỉ định. Ví dụ:

val a = Map(1 -> "one")  // an immutable Map[Int, String] 
val b = a(2) = "two" 
val c = b(5) = "five" 
val d = c(1) = "uno" 

d == Map(1 -> "uno", 2 -> "two", 5 -> "five")  // => true 

này hoạt động vì immutable.Map#update trả về một thể hiện của các mới Map. Có vẻ hơi kỳ quặc với mắt được đào tạo C, nhưng bạn quen với nó.

+3

Vì vậy, "m (K) = V" là cú pháp đường cho m.update (K, V). Làm thế nào có thể nói rằng đây là trường hợp? Những phương pháp khác có thể có đường cú pháp áp dụng cho chúng? Và tôi thậm chí không thể nhìn thấy một bản cập nhật phương pháp trên Bản đồ (hoặc bất kỳ bản kế thừa nào của nó) trong scaladoc. Làm thế nào tôi thậm chí biết rằng Bản đồ có một phương pháp như vậy? –

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