我是Scala的新手,所以我试图理解为什么对视图的调用会返回IndexedSeqViewS
和类似类的实例。为什么每个操作都需要一个不同的类?
答案 0 :(得分: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
。