2

我是 Scala 的新手,所以我试图理解为什么对视图的调用会返回IndexedSeqViewS类似类的实例。为什么每个操作都需要一个不同的类?

4

1 回答 1

3

因为每个视图转换器操作(即生成新视图的操作,如mapfilterslice都会创建一个以不同方式遍历底层集合的视图。请注意,这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(以及其他方法,如applysize等)的定义,需要引入子类。在一些替代设计中,例如基于类型类的设计,可能必须引入单独的类型类来重新定义foreach特定类型的内容。

于 2013-04-17T16:35:42.063 回答