首页 > 解决方案 > 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]()

我对这里发生的事情以及如何在派生类中实现缺失的方法感到困惑。

标签: scalaclassabstractextend

解决方案


请注意,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中运行。


推荐阅读