Scala 的 for each,为什么会有且仅有一次 recursion?
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)
是为什么呢?
Samip
10 years, 2 months ago
Answers
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
的指向, 应该清晰了吧.
正经的看片绅士
answered 10 years, 2 months ago