scala中的惰性函数定义
发布时间:2020-12-16 09:03:50 所属栏目:安全 来源:网络整理
导读:我一直在学习 scala,我必须说这是一个很酷的语言.我特别喜欢它的模式匹配功能和功能文字,但我来自一个 javascript,ruby背景,我最喜欢的模式之一就是这些语言的懒惰功能和方法定义模式. javascript中的一个例子是 var foo = function() { var t = new Date();
我一直在学习
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 那里的图案很贵:=> String被称为by-name参数,您可以将其称为“给我一些可以根据请求生成字符串的东西”.请注意,如果您使用它两次,它将每次重新生成,这是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参数)才能生成它,并将其存储并重新使用它(如果你需要再次使用). 所以这样做,而不是JavaScript的方式,即使你可以使Scala看起来很像JavaScript. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |