私は最近、複数のストリームを反復処理することで、最初のアイテムだけを反復するという、自分のコードのバグに遭遇しました。ストリームをバッファに変換しました(呼び出す関数の実装がストリームを返すことに気づいていなかった)問題が修正されました。私は信じて、このハード見つかったので、私は最小の検証例を作成した:なぜ複数のストリームを反復処理するのが最初の要素に対してのみ反復処理を行うのですか?
def f(as: Seq[String], bs: Seq[String]): Unit =
for {
a <- as
b <- bs
} yield println((a, b))
val seq = Seq(1, 2, 3).map(_.toString)
f(seq, seq)
println()
val stream = Stream.iterate(1)(_ + 1).map(_.toString).take(3)
f(stream, stream)
その入力のすべての組み合わせを印刷し、そして配列で呼び出される関数[1、2、3]、ストリーム[1 、2,3]。
配列との結果は次のとおりです。
(1,1)
(1,2)
(1,3)
(2,1)
(2,2)
(2,3)
(3,1)
(3,2)
(3,3)
とストリームとの結果は次のとおりです。
(1,1)
私だけを反復処理する、複数の発電機を反復処理する際に、これを複製することができました単一のストリームが正常に動作するようです。
私の質問は次のとおりです:なぜこれが起こるのですか?このようなグリッチを避けるにはどうしたらいいですか?つまり、すべてのマルチジェネレータ反復の前に.toBuffer
または.to[Vector]
を使用するのに不足していますか?
ありがとうございました。
mind.setIsBlown(真) – Phoenix
は 'を省略利回りは正確に私が何d idは 'f_strict'です。 –
どのように私はそれを逃したのですか? – Phoenix