比較 - scala traversable




Scala:ScalaコレクションのTraversableとIterableの違いは何ですか? (2)

私はこの質問を見てきましたが、IterableとTraversableの違いはまだ分かりません。 誰か説明できますか?


tl; dr IterablesはステートフルIteratorsを生成できるTraversablesです

まず、IterableはTraversable Iterableであることを知ってIterable

次に、

  • Traversableではforeachメソッドを実装する必要があります。これは他のすべてで使用されます。

  • Iterableでは、他のすべてで使用されるiteratorメソッドを実装する必要があります。

例えば、 Traversablefindの実装はforeach (forの理解を介して)使用し、 BreakControl例外をスローして、満足のいく要素が見つかったら反復を停止します。

trait TravserableLike {
  def find(p: A => Boolean): Option[A] = {
    var result: Option[A] = None
    breakable {
      for (x <- this)
        if (p(x)) { result = Some(x); break }
    }
    result
  }
}

対照的に、 Iterable減算はこの実装をオーバーライドし、 Iteratorfindを呼び出しますIterableは、要素が見つかると繰り返しを停止します。

trait Iterable {
  override /*TraversableLike*/ def find(p: A => Boolean): Option[A] =
    iterator.find(p)
}

trait Iterator {
  def find(p: A => Boolean): Option[A] = {
    var res: Option[A] = None
      while (res.isEmpty && hasNext) {
        val e = next()
        if (p(e)) res = Some(e)
      }
    res
  }
}

Traversable反復の例外をスローするのはTraversableありませんが、これはforeachだけを使用すると部分的に反復する唯一の方法です。

iteratorを使用してforeachを簡単に実装できるため、 Iterableはより厳しい/強力な特性ですが、実際にはforeachを使用してiterator実装することはできません。

要約すると、 Iterableは、ステートフルIterator反復を一時停止、再開、または停止する方法を提供します。 Traversableでは、すべてまたは何もありません(フロー制御の例外はありません)。

ほとんどの場合、それは問題ではないので、より一般的なインターフェースが必要になります。 しかし、 Iteratorをカスタマイズする必要がある場合は、 Iterator必要とします。 Iteratorは、 Iteratorから取得できます。


それを吹くことと吸うことの違いと考えてください。

Traversableforeachまたはその派生したメソッドを呼び出すと、その値を関数に一度に1つずつ吹き飛ばすので、反復を制御できます。

IterableIterableによって返されると、あなたはそれから値をIterable 、次のものに自分自身を移動するときを制御します。





scala-collections