2013-03-24 25 views
16

Tôi đang làm việc thông qua Scala của Cay Horstmann cho cuốn sách Thiếu kiên nhẫn nơi tôi bắt gặp cách cập nhật bản đồ có thể thay đổi này.Cú pháp cập nhật Bản đồ [map (key) = newValue] của Scala có thể thay đổi như thế nào?

scala> val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) 
scores: scala.collection.mutable.Map[String,Int] = Map(Bob -> 3, Alice -> 10, Cindy -> 8) 

scala> scores("Alice") // retrieve the value of type Int 
res2: Int = 10 

scala> scores("Alice") = 5 // Update the Alice value to 5 

scala> scores("Alice") 
res4: Int = 5 

Dường như scores("Alice") hits apply trong MapLike.scala. Nhưng điều này chỉ trả về giá trị, không phải cái gì có thể được cập nhật.

Ra khỏi tò mò Tôi đã thử các cú pháp tương tự trên bản đồ bất biến và đã được trình bày với các lỗi sau,

scala> val immutableScores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) 
immutableScores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 10, Bob -> 3, Cindy -> 8) 

scala> immutableScores("Alice") = 5 
<console>:9: error: value update is not a member of scala.collection.immutable.Map[String,Int] 
       immutableScores("Alice") = 5 
     ^

Trên cơ sở đó, tôi giả định rằng scores("Alice") = 5 được chuyển thành scores update ("Alice", 5) nhưng tôi không có ý tưởng cách nó hoạt động, hoặc làm thế nào nó thậm chí có thể.

Tính năng này hoạt động như thế nào?

+1

Tôi tin rằng đó chỉ là đường thực tiễn. Không có một số bài học cơ bản sâu xa ở đây theo như tôi hiểu. – placeybordeaux

+1

Như bạn có thể thấy, phương thức 'update' được gọi, không phải phương thức' apply'. –

+0

có nghĩa là bất biến ** Chỉ đọc ** và các phương tiện có thể thay đổi ** Đọc/Ghi ** để vấn đề được araised –

Trả lời

22

Đây là ví dụ về cú pháp apply, update.

Khi bạn gọi map("Something"), cuộc gọi này map.apply("Something") mà lần lượt gọi get.

Khi bạn gọi map("Something") = "SomethingElse", hãy gọi số map.update("Something", "SomethingElse") mà lần lượt gọi put.

Hãy xem this để có giải thích đầy đủ hơn.

-1

Vấn đề là bạn đang cố gắng cập nhật bản đồ bất biến. Tôi đã được thông báo lỗi tương tự khi bản đồ của tôi đã được khai báo là

var m = new java.util.HashMap[String, Int] 

Nhưng khi tôi thay thế định nghĩa bởi

var m = new scala.collection.mutable.HashMap[String, Int] 

các m.update làm việc.

+0

OP xác định rõ ràng bản đồ là có thể thay đổi. – Jason

+0

hashMap là bộ sưu tập có thể thay đổi – BDR

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