Scala 2.10/2.11 中,运行
val l = MutableList(16)
for (i<-l) {
val p = i/2
if (!(l contains p)) {
l += p
}
}
l
得到的是
MutableList[Int](16, 8, 4)
如果是返回 MutableList[Int](16, 8)
(如同 JavaScript 或 PHP)的话我能理解。
或者是返回 MutableList[Int](16, 8, 4, 2, 1, 0)
(如同 Python 或 Ruby) 我也能够理解。
但是返回 MutableList[Int](16, 8, 4)
是为什么呢?
LZ 的写法确实应该避免.
不过如果深究的话, LZ 的 for 语句, 其实是 foreach 的语法糖 (如果大括号中有 yield, 那就是 map 了).
所以LZ的写法其实是如下的语句:
val l = MutableList(16)
l.foreach{
case i =>
if (!(l contains p)) {
l += p
}
}
l
好了, 现在看一下 foreach
的源码:
override /*IterableLike*/
def foreach[B](f: A => B) {
var these = this
while (!these.isEmpty) {
f(these.head)
these = these.tail
}
}
注意 these
的指向, 应该清晰了吧.
为毛要写出这样的代码。在java里一边循环一边修改array就是不允许的。所以这种费解的代码是为了了解编译原理么?