web-dev-qa-db-ja.com

Scalaの可変マップはどのように[map(key)= newValue]構文を更新するのですか?

私はケイホルストマンのScala=を介して作業しており、変更可能なマップを更新するこの方法に出くわしたせっかちな本です。

_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
_

_MapLike.scala_でscores("Alice")applyにヒットするように見えます。ただし、これは値を返すだけで、更新可能なものは返しません。

好奇心から、不変のマップで同じ構文を試しましたが、次のエラーが表示されました、

_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
          ^
_

これに基づいて、私はscores("Alice") = 5scores update ("Alice", 5)に変換されると想定していますが、それがどのように機能するか、それがどのように可能かさえわかりません。

それはどのように機能しますか?

21
Dan Midwood

これは、applyupdate構文の例です。

map("Something")を呼び出すと、map.apply("Something")が呼び出され、次にgetが呼び出されます。

map("Something") = "SomethingElse"を呼び出すと、map.update("Something", "SomethingElse")が呼び出され、次にputが呼び出されます。

より完全な説明については this を見てください。

25

あなたはこれを試すことができます:=>マップのリストを更新する

import Java.util.concurrent.ConcurrentHashMap
import scala.collection.JavaConverters._
import scala.collection.concurrent

val map: concurrent.Map[String, List[String]] = new ConcurrentHashMap[String, List[String]].asScala

def updateMap(key: String, map: concurrent.Map[String, List[String]], value: String): Unit = {
map.get(key) match {
case Some(list: List[String]) => {
val new_list = value :: list
map.put(key, new_list)
}
case None => map += (key -> List(value))
}
}
0
AlexPes