gpt4 book ai didi

scala - 为什么 Scala 库是用可变状态实现的?

转载 作者:行者123 更新时间:2023-12-01 06:59:51 25 4
gpt4 key购买 nike

为什么 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的方法,也许是类似

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 的方法?

最佳答案

只要他不共享,拥有可变状态就没有坏处。

在您的示例中,无法从外部访问可变变量,因此该可变变量不可能因副作用而改变。

尽可能地强制执行不可变性总是好的,但是当性能很重要时,只要以安全的方式对其进行约束,具有一些可变性就没有错。

注意:迭代器是一种数据结构,它不是没有副作用的,这可能会导致一些奇怪的行为,但这是另一回事,绝不是以这种方式设计方法的原因。您也会在不可变数据结构中找到类似的方法。

关于scala - 为什么 Scala 库是用可变状态实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16155248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com