2016-11-29 2 views
1

質問1ですScalaのドキュメントではTraversableのは、形質またはクラス

、私はTraversableの抽象メソッドforeachと形質であることがわかりましたTraversable型のオブジェクトをインスタンス化しますか?

val t = Traversable(1,2,3) 

t.foreach(println _) //where is Scala picking foreach a definition from? 

質問2 - リストや配列などの他のクラスとは別のTraversableのですか?それは、配列、セットまたはマップカテゴリの下に来るん(私は他のコレクションがTraversableの継承と思った)

質問3 - 私はドキュメントごとに、反復処理可能で抽象メソッドを持っているにもかかわらずIterable形質について、正確に同じことを行うことができ、iterator

val v1 = Iterator(1,2,3) 

v1.foreach(println _) 

何が欠けていますか?

答えて

5

質問1:Traversable(1,2,3)を実行すると、実際にTraversable特性のコンパニオンオブジェクトでapplyメソッドが呼び出されています。このメソッドは、実際にあなたが提供した要素(ListTraversable)でListを作成します。したがって、あなたが呼んでいるforeachメソッドは、実際にforeachメソッドListです。

質問2:はい、Traversableは、Scalaのコレクション階層の上位にある特性です。 とは具体的なコレクションの実際の例ですが、Traversableは多くのコレクションが実装する一般的な特性です。

質問3:IterableIteratorは同じものではありません。あなたは質問にそれらを混ぜているようです。 Iterable(1,2,3)は、Traversable(1,2,3)と全く同じことを行います。それはIterableのコンパニオンオブジェクトのapplyメソッドを呼び出し、Listを返します。 Iterator(1,2,3)ただし、Iteratorapplyメソッドが呼び出され、新しいIteratorが3つの番号を反復して表示されます。

+0

ありがとうございました。コンパニオンオブジェクトを作成する理由はありますか?私はTraversableまたはIterableのオブジェクトを使用するシナリオを見ることができません。 –

+0

コンパニオンオブジェクトには、通常、クラスのクリエータが含まれています。コンパニオンオブジェクトは常にクラスと同じファイルに定義され、クラスと同じ名前を持ちます。 'Traversable'のコンパニオンオブジェクト用のAPIドキュメントは、http://www.scala-lang.org/api/2.12.0/scala/collection/Traversable$.htmlにあります。 – marstran

関連する問題