scala - scala.collection.mutable.Map 抽象时如何扩展?
问题描述
我正在尝试扩展scala.collection.mutable.Map
. 我正在查看https://www.scala-lang.org/api/current/scala/collection/mutable/Map.html。文档说类是抽象的。然而我可以实例化一个可变的 Map 像
val m = scala.collection.mutable.Map[Int, Int]()
我对这里发生的事情以及如何在派生类中实现缺失的方法感到困惑。
解决方案
请注意,Map
扩展MapFactory.Delegate[Map](HashMap)
. 你可以看到它的 Scala 源代码:
object Map extends MapFactory.Delegate[Map](HashMap) {
里面有MapFactory.Delegate
一个apply
方法,就是你调用的方法(这个类中的第一个方法):
class Delegate[C[_, _]](delegate: MapFactory[C]) extends MapFactory[C] {
override def apply[K, V](elems: (K, V)*): C[K, V] = delegate.apply(elems: _*)
def from[K, V](it: IterableOnce[(K, V)]): C[K, V] = delegate.from(it)
def empty[K, V]: C[K, V] = delegate.empty
def newBuilder[K, V]: Builder[(K, V), C[K, V]] = delegate.newBuilder
}
从您的评论来看,您似乎想要实现自定义更新。你可以试试这个功能:
def customUpdate[K](m: mutable.Map[K, Int], key: K, value: Option[Int]): Unit = {
value.fold {
m.remove(key)
} { newValue =>
m.updateWith(key) {
case None =>
Some(newValue)
case Some(currentValue) =>
Some(currentValue + newValue)
}
}
}
这在您的评论中创建了预期的输出。代码在Scastie中运行。
推荐阅读
- batch-file - 在带有批处理文件的弹出窗口上发送回车键
- sql-server - 多列表中是否有任何优雅的编程操作?
- beautifulsoup - 用 BeautifulSoup + Python 刮掉 href 内的超链接
- python-3.x - 如何从一系列器官随时间移动的图像的 FFT 中获取 H1 和 DC 图像
- swagger - 如何在招摇的@ApiResponse中设置自定义示例
- python - 从命令行运行 Python 模块,就像在 Pycharm 中一样
- c++ - 使用 unique_ptr 和原始指针重载全局函数
- reactjs - reactjs中不同页面的可重用组件
- python - 如何使用python将所有具有相同值的元素收集到数组中?
- git - 提交时是否创建了所有树对象?