在迭代文本文件的字符时,我会遇到一些不一致的行为。
以下脚本
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”和第二行文本)
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。
有人可以为我阐明这一点吗?我已经在十六进制编辑器中打开了文本文件,它对我来说没问题(纯ascii,没有UTF的东西)。
编辑:在Ubuntu上使用Scala 2.9.2
编辑2:现在我很困惑。以下内容来自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
修改)。
答案 0 :(得分:2)
在scala中,val是不可变对象。一旦设置了val,就不能改变它。当您调用iter.dropWhile(_.isWhitespace)
时,正在创建一个新对象,但不会存储在任何位置。如果要删除空格,则应将iter.dropWhile(_.isWhitespace)
分配给新的val,并在for表达式中调用此新值。