2016-06-30 6 views
0

ビルトインメソッドを使用してリストをイテレータに変換するときに問題があります。Scala:List.iteratorが空のイテレータを生成

  1. iterator.hasNextを呼び出すと、iterator.sizeの値が変更されます。
  2. iterator.hasNext == falseの前にも、反復が発生しています。

これらの問題の原因となる考え方について教えてください。

val list = scala.collection.immutable.List(1, 2, 3) 
val iterator = list.iterator 
println(iterator.size) // 3 
println(iterator.hasNext) // false 
println(iterator.size) // 0 

Scalaバージョン2.11.4(OpenJDK 64ビットサーバーVM、Java 1.8.0_72)でローカルに確認されています。

IdeOneで確認済みhere

+4

Iterator docs APIから: "特に明記しない限り、イテレータを使用してイテレータを使用するべきではないことに注意することが特に重要です。"これには 'size'メソッドが含まれます。 – Brian

答えて

5

サイズが格納されていないので、イテレータのサイズを計算すると、サイズが計算されます。 API(イテレータのサイズを提供する)が誤解を招くにもかかわらず、意図したように機能していると思います。

+1

「食べる」とはどういう意味ですか? –

+1

良いキャッチは、誤解を招くような「邪悪な」バージョンを表現したかったのです。用語は私が意味したことを表現すると思ったが、そうではない。 – uberwach

+1

私は「食べる」という言葉の選択を認めています。私はこのクールークを自分で発見したときに少しpeavedしました。 –

関連する問題