2017-11-06 5 views
1

トラバーサルは、コレクション階層の最上位です。その主な方法は 'foreach'なので、コレクションの各要素に対して何かをすることができます。ScalaコレクションAPIの階層図に、TraversableとIterableがルートに存在するのはなぜですか?

Iterableは、どのforeachを実装できるかに基づいてIteratorを作成できます。これは要素のいくつかの順序を定義しますが、その順序はすべての反復子で変更される可能性があります。

Traversableから継承する唯一のクラスはIterableです。なぜ、2つのクラスを1つのクラスに統一しないのですか?

答えて

3

あなた自身が観察したように、いつもforeachiteratorとして実装できます。逆の場合は当てはまりません。foreachしかない場合は、一般的にiteratorを実装できません。これを行う唯一の方法は、終了するまでforeachを実行し、要素を別のコレクションに収集し、このコレクションのイテレータを返します。これは、大規模なコレクションでは効率的でなく、無限のコレクションでは完全に不可能です。

しかし、標準ライブラリには実際にはTraversableではなく、Iterableでないものは含まれていません。実際には例を考え出すのは実際には難しいです。基本的には、Traversableでも可能ですが、反復を可能にするものであればイテレータ内で実現可能ではないいくつかの反復状態を保持する必要がある場合はIterableではありません。たとえば、プッシュ型XMLパーサを提供するSAX APIのラッパーがあります。これらのパーサーはコールバック駆動型です。パーサへのコールバックを提供し、解析が終了するまで自動的に実行され、XML構造のさまざまな種類の要素に対応するコールバックオブジェクトのメソッドを呼び出します。 SAXパーサー用にTraversableラッパーを作成することはほとんどありません。 Iterableラッパーを作成することは不可能です(先に述べたように結果を収集することなく、非常に非効率的です)。一方、JavaSEでは基本的にイテレータベースのStAX APIも提供されているため、StAXパーサーのIterableラッパーも非常に簡単に実装できます。

実際、Scalaの著者はまた、Traversableがそれほど有用ではないことも認識しています。そしてそれがTraversableがScala 2.13で出荷されるredesigned collections libraryに存在しない理由です。 Traversableがなぜ悪いのかという別の視点も、hereで見つけることができます。

関連する問題