3

こんにちは、私は scala での奇妙な動作と思われるものを見ています。bufferedIterator で head を呼び出すと、内部関数で head がインクリメントされているようです。私の予想が間違っている場合、出力が正しいのはなぜですか。それとも、出力が間違っていますか?

与えられた:

import scala.io.Source

val source = Source.fromString("abcdef")

val buff1 = source.buffered;

println("outer head 1: " +buff1.head)
println("outer head 2: " +buff1.head)

def readLine():List[String] = {
  def buffered = source.buffered
  def readLine(tokens:List[String] , partialToken:String):List[String] = {
    println("head1 " + buffered.head)
    println("head2 " + buffered.head)
    return Nil;
  }
  return (readLine(Nil, ""));
}

readLine();

私にとってこれの期待される出力は

outer head 1: a
outer head 2: a
head1: a
head2: a

実際の出力は次のとおりです。

outer head 1: a
outer head 2: a
head1 b
head2 c
4

3 に答える 3

1

bufferedIterator で head を呼び出すと、内部関数で head がインクリメントされているようです。

注: (2016 年 7 月 3 年後)

コミット 11688ebショー:

SI-9691BufferedIteratorは、headOption

これにより、新しい API がBufferedIterator特性に公開されます。
イテレータの次の要素を として返しますOption

Some(value)次の値があれば戻り None、次の要素がなければ戻ります。

これは、あらゆる種類の増分を回避するのに役立ちます。

于 2016-07-25T11:50:45.877 に答える
1

scala.io.Sourceであり、 のように動作しIterator[Char]ます。したがって、一度に複数の場所で使用しないようにする必要があります。例でIterator.nextは3つの異なるから3回呼び出されるBufferedSourceため、異なる値が得られます。

  1. buff1.head: バッファリングされたソースheadはまだ何もバッファリングしていません。nexta
  2. buff1.head繰り返しますが、ここではヘッドが既にバッファリングされているためa、内部ソースは変更されません。
  3. buffered.head:bufferedは であるためdef、これは と同等source.buffered.headです。この新しいバッファリングされたソースはまだ何もバッファリングされていないため、要求するheadと内部ソースから要素が取得されるため、b.
  4. buffered.head: これにより、上記と同じように、さらに別のバッファリングされたソースが作成され、 が得られcます。

肝心なのは、 を呼び出した場合は、直接再度source.buffered使用sourceしたり、何度も呼び出したりしないことです。

bufferedあなたの例は、すぐに呼び出すことで修正できます。

val source = Source.fromString("abcdef").buffered

が何度も呼び出されないようにするdef buffered =こともできます。val buffered =source.buffered

于 2013-06-09T17:28:18.727 に答える
0

関数ではなく単純なフィールドをインクリメントすることを除いて、あなたは正しいです: 66行目のIndexedSeqLike、いくつかのIDEデバッガーを使用して自分でチェックアウトし、ステップバイステップで実行することができます

于 2013-06-09T17:27:49.890 に答える