【问题标题】:Scala forward reference of nested recursive function嵌套递归函数的Scala前向引用
【发布时间】:2015-10-24 10:19:07
【问题描述】:

我有一个带有嵌套递归函数的非常简单的方法定义:

def bar(arr : Array[Int]) : Int = {
  val foo : Int => Int = (i: Int) => if(i == 0) 0 else i + foo(i-1)
  foo(3)
}

但我收到此错误:

<console>:36: error: forward reference extends over definition of value foo
     val foo : Int => Int = (i: Int) => if(i == 0) 0 else i + foo(i-1)
                                                              ^

如果我只是单独放置 val foo: ... = ... 行,而不是嵌套在 def 中,那么一切正常

【问题讨论】:

  • 你为什么不把它设为def?

标签: scala recursion forward-reference


【解决方案1】:

你可以把它设为lazy val:

def bar(arr : Array[Int]) : Int = {
  lazy val foo : Int => Int = (i: Int) => if(i == 0) 0 else i + foo(i-1)
  foo(3)
}

def:

def bar(arr : Array[Int]) : Int = {
  def foo(i: Int): Int = if(i == 0) 0 else i + foo(i-1)
  foo(3)
}

当你

单独放置 val foo: ... = ... 行,而不是嵌套在 def 中

变成了字段和getter方法的组合,foo(i-1)实际上调用的是getter方法,而不是引用你定义的value,这是非法的;但是当你在方法中有val 时,它只是一个局部变量,没有getter 方法。

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 2019-12-04
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2016-07-12
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多