我正在运行以下代码:
val it = List(1,1,1,2,2,3,3).iterator.buffered
val compare = it.head
it.takeWhile(_ == compare).toList
它返回 (1,1,1)。但是,如果我将其运行为:
val it = List(1,1,1,2,2,3,3).iterator.buffered
it.takeWhile(_ == it.head).toList
我得到(1,1)。为什么会这样呢?不是head
致电后评估takeWhile
结果应该是一样的?
因为迭代器是可变的,所以值it.head
取决于评估的时间。
检查实施takeWhile https://github.com/scala/scala/blob/v2.10.1/src/library/scala/collection/Iterator.scala#L505显示它删除了迭代器的头部before应用谓词。
所以,在第三次迭代中,it.head
从谓词内部评估将是2
,因为第三个元素已被删除。
这说明了为什么您应该更喜欢不变性。它排除了诸如此类的一整类非显而易见的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)