首页 > 解决方案 > Scala 编译问题“前向引用扩展了值的定义”

问题描述

以下代码片段仅在方法级别实现时才会发生编译错误,并且在 main 中定义时不会发生错误。有什么区别 ?使用的 Scala 版本是 2.13.5。

class FibonacciGenerator  {
  def generate(total: Int): List[Int] = {
    val fibSeries: LazyList[Int] = LazyList.cons(1, LazyList.cons(1, fibSeries.zip(fibSeries.tail).map { t => t._1 + t._2 }))
    fibSeries.take(total).toList
  }
}

相同的实现在下面不会失败。

object Misc extends App {

  val x: LazyList[Int] = LazyList.cons(1, LazyList.cons(1, x.zip(x.tail).map{t => t._1 + t._2}))
  println(x)
  println(x.take(10).toList)

标签: scalalazy-evaluationscala-2.13

解决方案


不同之处在于,在后一种情况下,您使用的是延迟创建的对象

一个对象...在被引用时是惰性创建的,就像惰性 val 一样。

在第一种情况下,如果您声明lazy val fibSeries.


推荐阅读