gpt4 book ai didi

scala - 在Scala中成功实现MapLike

转载 作者:行者123 更新时间:2023-12-01 17:42:03 26 4
gpt4 key购买 nike

我正在用 scala 实现一个 Map,输入(出于我们的目的)[String, Set[Foo]],为值中的 Foo 提供额外的操作。实际的实现比下面介绍的要复杂,但这就是要点。我需要一个类来实现所有类似 Map 的函数,并在作为映射值的集合上提供额外的聚合。我见过的带有 MapLike 模式的扩展 Map,特别是 this ,不工作。

到目前为止我所得到的:

import scala.collection.{immutable, Map, MapLike}

class Foo(a:Int)

class CustomMap
(val underlying:Map[String,Set[Foo]] = Map[String,Set[Foo]]())
extends Map[String, Set[Foo]] with MapLike[String, Set[Foo], CustomMap] {
override def empty = new CustomMap(underlying.empty)

def -(key: String) = new CustomMap(underlying - key)

def +[B1 >: Set[Foo]](kv: (String, B1)): scala.collection.Map[String,B1] = new CustomMap(underlying + (kv._1 -> kv._2))

def get(key: String): Option[Set[Foo]] = underlying.get(key)

def iterator: Iterator[(String, Set[Foo])] = underlying.iterator

override def size = underlying.size

def getAllFoos() = underlying.values.flatten.toSet
}

val cm1:CustomMap = new CustomMap(Map("a" -> Set(new Foo(1))))
val cm2:CustomMap = cm1 + ("a" -> Set(new Foo(2)))
println(cm2.getAllFoos)

+ 方法和访问额外聚合方法都存在问题。

有什么指点吗?

file.scala:12: error: type mismatch;
found : B1
required: Set[this.Foo]
def +[B1 >: Set[Foo]](kv: (String, B1)): scala.collection.Map[String,B1] = new CustomMap(underlying + (kv._1 -> kv._2))
^
file.scala:24: error: type mismatch;
found : scala.collection.Map[String,Set[this.Foo]]
required: this.CustomMap
val cm2:CustomMap = cm1 + ("a" -> Set(new Foo(2)))
^
two errors found

最佳答案

+ 无法返回 CustomMap,因为有时 B1 不会是 Set[Foo]Set[Foo] 的其他一些父类(super class)型。这就是你错误的根源。 MapMapLike 适用于提供 map 实现的类,该实现可以安全地向其中添加任何值,并返回可用的 Map。因此 Map[String, Set[Foo]] 始终可以将 ("", 5) 放入其中并成为 Map[String, Any] .

您可以通过使用“pimp-my-library”模式消除底层周围的包装器,并避免这些问题:

implicit class FooSetMap(val map: Map[String,Set[Foo]]) extends AnyVal {
def getAllFoos = map.values.flatten.toSet
}

如果您愿意使用可变映射,请查看collection.mutable.MultiMap。它是一个 mixin 特征,它向 mutable.Map[A, mutable.Set[B]] 的子类型添加额外的方法来处理多重映射 - 您可以根据您的需要执行类似的操作。

关于scala - 在Scala中成功实现MapLike,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23897405/

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