作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在解析器组合器库的 Parsers.scala (Scala 2.9.1) 文件中,我似乎遇到了一个鲜为人知的 Scala 功能,称为“惰性参数”。这是一个例子:
def ~ [U](q: => Parser[U]): Parser[~[T, U]] = { lazy val p = q // lazy argument
(for(a <- this; b <- p) yield new ~(a,b)).named("~")
}
显然,将按名称调用参数 q
分配给惰性 val p
时发生了一些事情。
到目前为止,我还无法弄清楚它的作用以及它为什么有用。有人可以帮忙吗?
最佳答案
每次您请求时,都会调用按名称调用参数。惰性值第一次被调用,然后值被存储。如果您再次请求,您将获得存储的值。
因此,这样的模式
def foo(x: => Expensive) = {
lazy val cache = x
/* do lots of stuff with cache */
}
是一种终极的“尽可能推迟工作并且只做一次”的模式。如果您的代码路径根本不会让您需要 x
,那么它永远不会被评估。如果您多次需要它,它只会被评估一次并存储以供将来使用。因此,您可以保证执行零次(如果可能)或一次(如果不可能)次昂贵的调用。
关于Scala 的惰性参数 : How do they work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9809313/
我是一名优秀的程序员,十分优秀!