【发布时间】:2010-11-10 06:20:31
【问题描述】:
我问的问题与this one 略有不同。假设我有一个代码 sn-p:
def foo(i : Int) : List[String] = {
val s = i.toString + "!" //using val
s :: Nil
}
这在功能上等同于以下内容:
def foo(i : Int) : List[String] = {
def s = i.toString + "!" //using def
s :: Nil
}
为什么我会选择其中之一?显然我会假设第二个在以下方面有一些缺点:
- 创建更多字节码(内部
def被提升为类中的方法) - 调用方法而不是访问值的运行时性能开销
- 非严格评估意味着我可以轻松访问
s两次(即不必要地重做计算)
我能想到的唯一优势是:
- 对
s的非严格评估意味着只有在使用时才会调用它(但我可以只使用lazy val)
人们的想法是什么?将所有内心的vals defs 变成对我有很大的不利影响吗?
【问题讨论】:
-
但如果只使用一次,
lazy val会比def慢。 -
这是真的 - 但我预计过度使用
defs 会导致 massive 类膨胀 -
但同样,
lazy vals 也是如此。所以优势仍然存在。 -
两者都会使用方法作为访问器,所以这样想:如果你想要一个 METHOD,使用 def,如果你想要一个 VALUE MEMBER,使用 val,如果你想要一个 NON-STRICT VALUE MEMBER,使用lazy val,如果你想要一个VARIABLE MEMBER,使用var。
标签: scala lazy-evaluation