2

テキスト ファイルの文字を反復処理すると、一貫性のない動作が発生します。

次のスクリプト

import io.Source
val source = Source.fromFile("blah")
val iter = source.buffered
iter.dropWhile(_.isWhitespace)
for( c <- iter ) {
    println("""char="%c", byte=%d, isWhitespace=%b""".format(c, c.toByte, c.isWhitespace))
}
source.close()

次のファイルを読み取ります (3 つのスペースで始まり、次に 'a' とテキストの 2 行目)

   a
bc de

以下を出力します

char=" ", byte=32, isWhitespace=true
char=" ", byte=32, isWhitespace=true
char=" ", byte=32, isWhitespace=true
char="a", byte=97, isWhitespace=false
char="
", byte=10, isWhitespace=true
char="b", byte=98, isWhitespace=false
char="c", byte=99, isWhitespace=false
char=" ", byte=32, isWhitespace=true
char="d", byte=100, isWhitespace=false
char="e", byte=101, isWhitespace=false
char="
", byte=10, isWhitespace=true

dropWhile(_.isWhitespace)3 つのスペースを削除しませんでしたが、c.isWhitespace直後の for ループで反復すると true を返します。

誰かが私のためにこれに光を当てることができますか? 16 進エディタでテキスト ファイルを開きましたが、問題ないように見えます (純粋な ascii で、UTF のものはありません)。

編集: Ubuntu で Scala 2.9.2 を使用する

EDIT2:今、私はかなり混乱しています。以下は、Windows 7 の REPL からのものです。

c:\projects\scratch>scala
Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val it = Iterator("a", "b", "cde", "f")
it: Iterator[String] = non-empty iterator

scala> val it2 = it.dropWhile(_.length < 2)
it2: Iterator[String] = non-empty iterator

scala> println(it.next)
cde

scala> println(it2.next)
f

代わりに、この正確なコードをスクリプトとして実行すると、元の質問の動作が生成されます (反復子は によって変更されませんdropWhile)。

4

1 に答える 1