为什么 Scala 标准库中的某些方法使用可变状态实现?
例如,find
作为类的一部分的方法scala.Iterator
被实现为
def find(p: A => Boolean): Option[A] = {
var res: Option[A] = None
while (res.isEmpty && hasNext) {
val e = next()
if (p(e)) res = Some(e)
}
res
}
可以作为@tailrec
'd 方法实现,可能类似于
def findNew(p: A => Boolean): Option[A] = {
@tailrec
def findRec(e: A): Option[A] = {
if (p(e)) Some(e)
else {
if (hasNext) findRec(next())
else None
}
}
if (hasNext) findRec(next())
else None
}
现在我想一个论点可能是可变状态的使用,而while
循环可能更有效,这在库代码中非常重要,可以理解,但对于@tailrec
'd 方法来说真的是这样吗?