是否可以使用单个关键字使scala对象中的所有值变为惰性

Jas*_*ond 5 scala lazy-evaluation

或者valscala对象默认是懒惰的?

无论如何,如果有必要val通过使用声明一个懒惰的对象lazy,是否可以做类似的事情

lazy object SomeObject
Run Code Online (Sandbox Code Playgroud)

或者(就像你在c ++中所做的那样)

object A {
lazy:
    val a
    val b
    ...
}
Run Code Online (Sandbox Code Playgroud)

因为我想要懒惰而不必重新贴上我val的所有lazy val

Tra*_*own 11

回答你的第一个问题(" valscala对象在默认情况下是懒惰的吗?"):不,不完全是,但对象本身有点懒,可能很懒.从Scala语言规范的 5.4("对象定义")开始:

请注意,对象定义定义的值是懒惰实例化的.该new m$cls构造函数是在对象定义的点没有评估,而是评估第一次m程序(这可能是从来没有的话)的执行过程中被取消引用.

所以,例如,如果我们有这三个对象:

object X {
  val answer = { println("Here's X's answer!"); 42 }
}

object Y {
  lazy val answer = { println("Here's Y's answer!"); 1 }
}

object Z extends App {
  println("Here we go.")
  println(X)
  println(Y)
  println(X.answer)
  println(Y.answer)
}
Run Code Online (Sandbox Code Playgroud)

然后当我们运行时Z,我们看到以下内容:

Here we go.
Here's X's answer!
X$@38d24866
Y$@f1aa6ce
42
Here's Y's answer!
1
Run Code Online (Sandbox Code Playgroud)

因此valin X不是懒惰,但直到我们第一次使用它时才会进行评估X.