gpt4 book ai didi

scala - scala 中的惰性函数定义

转载 作者:行者123 更新时间:2023-12-03 21:00:27 24 4
gpt4 key购买 nike

我一直在学习 scala,我不得不说它是一种非常酷的语言。我特别喜欢它的模式匹配功能和函数文字,但我来自 javascript、ruby 背景,我最喜欢这些语言中的模式之一是惰性函数和方法定义模式。 javascript中的一个例子是

var foo = function() {
var t = new Date();
foo = function() {
return t;
};
return foo();
};

相同的代码在 ruby​​ 中也有细微的调整,在执行计算后,您只需使用单例对象重新定义方法。当涉及昂贵的计算并且您不知道是否需要结果时,这种事情非常方便。我知道在 Scala 中我可以使用缓存来模拟相同类型的结果,但我试图避免条件检查,到目前为止我的实验返回了负面结果。有谁知道 Scala 中是否有惰性函数或方法定义模式?

注意:javascript 代码来自 Peter Michaux 的 site .

最佳答案

JavaScript 中所有复杂的代码似乎只是尝试缓存日期的值。在 Scala 中,您可以轻松实现相同的目标:

lazy val foo = new Date

而且,如果甚至不想创建 val,而是想调用一个仅在需要时才执行昂贵代码的函数,您可以
def maybeExpensive(doIt: Boolean, expensive: => String) {
if (doIt) println(expensive)
}
maybeExpensive(false, (0 to 1000000).toString) // (0 to 1000000).toString is never called!
maybeExpensive(true, (0 to 10).toString) // It is called and used this time

哪里图案 expensive: => String被称为按名称参数,您可以将其视为“给我一些将根据请求生成字符串的东西”。请注意,如果您使用它两次,它每次都会重新生成它,这就是 Randall Schultz 的方便模式的用武之地:
def maybeExpensiveTwice(doIt: Boolean, expensive: => String) {
lazy val e = expensive
if (doIt) {
println(e)
println("Wow, that was " + e.length + " characters long!")
}
}

现在,您仅在需要时生成(通过 by-name 参数)并存储它并在再次需要时重新使用它(通过惰性 val)。

所以这样做,而不是 JavaScript 的方式,即使你可以让 Scala 看起来很像 JavaScript。

关于scala - scala 中的惰性函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3562610/

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