【发布时间】:2013-05-12 21:38:13
【问题描述】:
我尝试做的是想出一个 case 类,我可以在模式匹配中使用它,它只有一个字段,例如一个不可变的集合。此外,我想使用 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 trait,名为 SetProxy。我找不到任何琐碎的例子,所以我不确定这个特征是否符合我的要求:
- 想出一个自定义类型,即与
Set不同的类型 - 类型必须是案例类(我们要做模式匹配)
- 我们需要“委托”方法 map、foldLeft 等,它们应该将调用传递给我们的实际集合,并以我们的新类型返回结果集合包装 arround
我的第一个想法是扩展Set,但我的自定义类型Foo 已经扩展了另一个类。因此,第二个想法是混合特征 Iterable 和 IterableLike。现在我对 SetProxy 的特性感到不满,这让我想到了哪个是“最好的”方式。你有什么想法和经历?
自从我三天前开始学习 Scala 以来,任何指点都非常感谢!
【问题讨论】:
标签: scala