我试图做的是提出一个案例类,我可以在模式匹配中使用它,它只有一个字段,例如一个不可变集。此外,我想利用 map、foldLeft 等应该传递给集合的函数。我尝试如下:
case class foo(s:Set[String]) extends Iterable[String] {
override def iterator = s.iterator
}
现在,如果我尝试使用例如 map 函数,我会收到一个类型错误:
var bar = foo(Set() + "test1" + "test2")
bar = bar.map(x => x)
found : Iterable[String]
required: foo
bar = bar.map(x => x)
^
类型错误非常好(在我的理解中)。但是,我想知道如何为一个集合实现一个包装案例类,以便可以调用 map、foldLeft 等并且仍然接收案例类的对象。需要覆盖所有这些功能还是有其他方法?
编辑
我倾向于接受对我有用的 Régis Jean-Gilles 的解决方案。然而,在谷歌上搜索了几个小时后,我发现了另一个有趣的 Scala 特征,名为SetProxy
. 我找不到任何琐碎的例子,所以我不确定这个特征是否符合我的要求:
- 想出一个自定义类型,即不同的类型
Set
- 类型必须是案例类(我们要做模式匹配)
- 我们需要“委托”方法 map、foldLeft 等,它们应该将调用传递给我们的实际集合,并以我们的新类型返回结果集合包裹的 arround
我的第一个想法是扩展Set
,但我的自定义类型Foo
已经扩展了另一个类。因此,第二个想法是混合特征 Iterable 和 IterableLike。SetProxy
现在我对让我思考哪个是“最好”的方式的特质感到愤怒。你有什么想法和经历?
自从我三天前开始学习 Scala 以来,任何指针都非常感谢!