我是 Scala 的新手,所以我试图理解为什么对视图的调用会返回IndexedSeqViewS
类似类的实例。为什么每个操作都需要一个不同的类?
问问题
104 次
1 回答
3
因为每个视图转换器操作(即生成新视图的操作,如map
或filter
)slice
都会创建一个以不同方式遍历底层集合的视图。请注意,这IndexedSeqViewS
不是该集合类的实际名称 - 它是toString
返回的美化名称。
例如,Mapped
视图创建了底层集合的视图,使得底层集合的每个元素都以某种方式进行转换。
这需要重新定义foreach
如下:
trait Mapped[B] extends Transformed[B] {
// ...
def foreach[U](f: B => U) {
for (x <- self)
f(mapping(x))
}
// ...
}
视图需要在Filtered
遍历时忽略一些元素:
trait Filtered extends Transformed[A] {
// ...
def foreach[U](f: A => U) {
for (x <- self)
if (pred(x)) f(x)
}
// ...
}
由于集合具有基于继承的设计,要覆盖foreach
(以及其他方法,如apply
、size
等)的定义,需要引入子类。在一些替代设计中,例如基于类型类的设计,可能必须引入单独的类型类来重新定义foreach
特定类型的内容。
于 2013-04-17T16:35:42.063 回答