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