【问题标题】:When does a Stream need to be lazy?Stream 什么时候需要惰性?
【发布时间】:2011-10-21 05:22:56
【问题描述】:

以下内容均用于创建整数流:

val s: Stream[Int] = 1 #:: s.map(_ + 1)

def makeStream = {
  val s: Stream[Int] = 1 #:: s.map(_ + 1)
  s
}

第一个很好;但是makeStream 方法不会编译:

error: forward reference extends over definition of value s
  val s: Stream[Int] = 1 #:: s.map(_ + 1)
                             ^

只有当我们将s 设为lazy val 时它才会编译。为什么方法里面需要lazy val,外面不行?

【问题讨论】:

    标签: scala stream lazy-evaluation


    【解决方案1】:

    在类中,val 定义反编译为引用隐藏类字段的“getter”方法。这些“getter”方法可以是自引用的(或者更确切地说,类初始化程序可以引用“getter”),因为这是 Java 方法的语义。请注意,val s 的“外部”定义实际上被 REPL 包装在隐藏类中(这就是 REPL 绕过不能在顶层声明 val 的限制的方式)。

    在方法内部,val 定义不会反编译成“getter”方法,而是反编译成在堆栈上生成值所需的字节码。另一方面,lazy val 总是需要一个“getter”方法,因此,它可以是自引用的。

    【讨论】:

      猜你喜欢
      • 2020-08-10
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2018-12-10
      • 2010-12-29
      • 2017-07-13
      相关资源
      最近更新 更多