为什么 Scala 引入惰性参数。它不应该由 JVM 管理(对用户不可见)如何初始化值吗?值得将控制权交给开发人员并将值定义为惰性值的真实世界用例是什么?
最佳答案
别名参数:主要动机之一是支持 dsls。它们允许您在 API 中拥有非常好的语法,几乎感觉就像它们内置在语言中一样。例如,您可以非常轻松地定义自己的自定义 repeat
-循环:
def repeat(body: =>Unit)(until: =>Boolean): Unit = {
body
if (until) {} else repeat(body)(until)
}
然后把它当作语言的一部分来使用。
var i = 0
repeat {
println(i)
i += 1
} (i < 3)
或者您可以像这样生成一个新线程:spawn { println("on the new thread!") }
,或者您可以对 FileInputStream
进行自动资源管理就像这样:withFile("/home/john/.bashrc") { println(_.contents) }
.
lazy
值(value)观 - 这里的动机是:
- 惰性数据结构,如
Stream
s在函数式语言中很流行,您可以使用它们来实现高效的数据结构,例如 Okasaki 的函数式队列。 - 避免分配或初始化一些从未在某些对象中使用过的昂贵资源,例如文件句柄或数据库连接。
- 初始化objects fields in the correct order , 对于由许多 mixin 组成的对象。
- 当有多个线程共享一个值时实现正确的“仅初始化一次”语义(参见 introduction here)。
- 为嵌套单例对象制定翻译方案:
class A { object B }
变成这样:
class A {
class A$B$
lazy val B = new A$B$
}
关于java - 什么时候在 Scala 中使用惰性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19955995/