gpt4 book ai didi

scala - 在 Scala 中使用默认值更新可变映射

转载 作者:行者123 更新时间:2023-12-04 08:18:01 25 4
gpt4 key购买 nike

考虑以下代码,该代码计算列表中每个字符串的频率并将结果存储在可变映射中。这很好用,但我不明白 += 方法是在哪里定义的?!这是一些奇怪的隐式转换的东西还是什么?我在某处看到了这段代码,但它没有包含对 += 的解释。

val list = List("a", "b", "a")
val counts = new scala.collection.mutable.HashMap[String, Int]().withDefaultValue(0)
list.foreach(counts(_) += 1)
counts
//> res7: scala.collection.mutable.Map[String,Int] = Map(a -> 2, b -> 1)

map 的 apply 返回一个 Int,但 Int 没有 += 并且这个方法用一个新值更新了 map,所以看起来好像 apply 返回一个具有 += 方法的可变整数......

最佳答案

这不是隐式转换 - 它是一种脱糖。
写作:

x += 1

脱糖:
x = x + 1

如果类 x没有 +=在其上定义的方法。

以同样的方式:
counts("a") += 1

脱糖:
counts("a") = counts("a") + 1

因为 counts("a")Int , 和 Int没有 +=方法定义。

另一方面,写作:
x(expression1) = expression2

desugars 调用 update Scala中的方法:
x.update(expression1, expression2)

每一个可变 Map有一个 update方法 defined - 它允许在 map 中设置键。

所以整个表达式被脱糖为:
list.foreach(x => counts.update(x, counts(x) + 1))

+=不要与 += 混淆方法在 mutable.Map在 Scala 中。如果该键已存在,该方法会更新映射中的条目,或者添加新的键值对。它返回 this引用,也就是同一张图,所以可以链接 +=调用。见 ScalaDocsource code .

关于scala - 在 Scala 中使用默认值更新可变映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14604952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com