2

私は Scala を初めて使用するので、ビューの呼び出しがIndexedSeqViewSおよび類似のクラスのインスタンスを返す理由を理解しようとしています。操作ごとに異なるクラスが必要なのはなぜですか?

4

1 に答える 1

3

ビュー トランスフォーマーの各操作 (つまりmapfilterやなどの新しいビューを生成する操作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サブクラスを導入する必要があります。型クラスに基づくものなど、いくつかの代替設計では、特定の型の定義を再定義するために別の型クラスを導入する必要がある場合があります。applysizeforeach

于 2013-04-17T16:35:42.063 に答える