我一直在学习 Scala,我不得不说这是一门非常酷的语言。我特别喜欢它的模式匹配功能和函数文字,但我有 javascript、ruby 背景,这些语言中我最喜欢的模式之一是惰性函数和方法定义模式。 JavaScript 中的一个例子是
var foo = function() {
var t = new Date();
foo = function() {
return t;
};
return foo();
};
经过细微调整的相同代码可以在 ruby 中使用,您只需在执行计算后使用单例对象重新定义方法。当涉及昂贵的计算并且您不提前知道是否需要结果时,这种事情非常方便。我知道在 scala 中我可以使用缓存来模拟相同类型的结果,但我试图避免条件检查,到目前为止我的实验返回了负面结果。有谁知道scala中是否有惰性函数或方法定义模式?
注意:javascript代码来自Peter Michaux的site http://peter.michaux.ca/articles/lazy-function-definition-pattern.
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 参数)and存储它并在您再次需要时重新使用它(通过惰性 val)。
所以用这种方式,而不是 JavaScript 方式,即使你could让 Scala 看起来很像 JavaScript。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)