我正在运行以下代码:
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,因为第三个元素已被删除.
这说明了为什么你应该选择不变性.它排除了一类像这样的非显而易见的行为.
| 归档时间: |
|
| 查看次数: |
10408 次 |
| 最近记录: |