13

Scala は、Iterator を Iterable で (ラップすることによって) 変換するための組み込みクラス、ユーティリティ、構文、またはその他のメカニズムを提供しますか?

たとえば、Iterator[Foo] があり、Iterable[Foo] が必要なので、現在は次のようになっています。

 val foo1: Iterator[Foo] = ....
 val foo2: Iterable[Foo] = new Iterable[Foo] {
   def elements = foo1
 }

これは醜く不必要に思えます。より良い方法は何ですか?

4

2 に答える 2

14

IteratorScala 2.8.0 にはtoIterableメソッドがありますが、2.7.7 以前にはありません。暗黙的ではありませんが、必要に応じて独自の暗黙的な変換を定義できます。

于 2010-04-30T18:38:43.070 に答える
8

を暗黙的に(私は通常 -を明示的に使用します)に変換する場合は、十分に注意する必要があります。この理由は、結果を期待するメソッド(または関数)に渡すことにより、プログラムが破損する可能性がある範囲で結果を制御できなくなるためです。これが1つの例です:IteratorIterableIterator.toListIterable

def printTwice(itr : Iterable[String]) : Unit = {
    itr.foreach(println(_))
    itr.foreach(println(_))
}

Iteratorが何らかの形で暗黙的にに変換可能である場合Iterable、次は何を出力しますか?

printTwice(Iterator.single("Hello"))

(もちろん)Helloを1回だけ印刷します。ごく最近、とtrait TraversableOnceを統合するコレクションライブラリにが追加されました。私の考えでは、これは間違いなく間違いです。IteratorIterable

私の個人的な好みは、Iterator可能な限り明示的に使用してListから、SetまたはIndexedSeq直接使用することです。渡されるタイプに完全に依存しないメソッドを作成することはめったにないことがわかりました。一例:

def foo(trades: Iterable[Trade]) {
  log.info("Processing %d trades", trades.toList.length) //hmmm, converted to a List

  val shorts = trades.filter(_.side.isSellShort)
  log.info("Found %d sell-short", shorts.toList.length) //hmmm, converted to a List again

  //etc
于 2010-04-30T20:27:05.537 に答える