Scala 列出了“var”的用法

use*_*107 3 scala tail-recursion

我对 Scala 还是比较陌生。我正在浏览 Scala 的 List 实现,在那里我看到很多函数在实现中仍然使用“var”。我一直在阅读 scala 如何更加面向功能,因此如果库尽可能不使用尾递归,则不要使用“var”。

例如,exsits 可以重写为:

@tailrec
def exists[A](f : A => Boolean) : Boolean = this match {
    case Nil => false
    case l:LinearSeq[A]=> if (f(l.head)) true else exists(l.tail,f)
}
Run Code Online (Sandbox Code Playgroud)

我问的原因是因为我阅读了很多不鼓励使用“var”的材料,但我看到在 List 实现中使用了很多。

谢谢!

Ale*_*nov 5

当你有类似的东西时List,它在几乎每个 Scala 程序中都经常使用:

  1. 即使是很小的加速(或减速)也会产生很大的累积效应;

  2. 它的贡献者往往是非常了解 Scala 底层细节的人(如果有些人不知道,他们的补丁将由那些了解的人审查)。

因此,给刚学习 Scala 的人的建议并不是特别适用。

对于这个特定的例子:@tailrec直到 Scala 2.8 才存在,这段代码可能是更早编写的(我没有检查过)并且没有足够的理由重写它。

  • 我曾经参加过一个关于新人技巧的讲座。其中一个(非常合理的)提示是“始终将您的案例课程定为最终的”。Odersky 参加了演讲,在问答期间他提到编译器团队有时会利用案例类不会自动最终进行某些优化的事实。最后,该提示被修改为听起来更像是“始终将您的案例课程定为最终的……除非您知道自己在做什么。” 这可能是一个很好的一般建议。只要你能告诉你你真的知道你在做什么。;) (2认同)
  • @Tim 好吧,没有足够好的理由(根据 Scala 团队的说法):) (2认同)