Scala - 迭代器和takeWhile

Bob*_*r02 8 iterator scala

我正在运行以下代码:

 val it = List(1,1,1,2,2,3,3).iterator.buffered
 val compare = it.head
it.takeWhile(_ == compare).toList
Run Code Online (Sandbox Code Playgroud)

它返回(1,1,1).但是,如果我这样运行:

val it = List(1,1,1,2,2,3,3).iterator.buffered
it.takeWhile(_ == it.head).toList
Run Code Online (Sandbox Code Playgroud)

我得到(1,1).为什么会这样?是否head在通话时评估,takeWhile结果应该相同?

Ben*_*mes 16

因为迭代器是可变的,所以it.head它的值取决于它的计算时间.

检查实现会takeWhile发现它应用谓词之前删除了迭代器的头部.

因此,在第三次迭代中,it.head从谓词内部进行评估2,因为第三个元素已被删除.

这说明了为什么你应该选择不变性.它排除了一类像这样的非显而易见的行为.