0

在我的 Test.scala 中,我定义了一个 Trait 和 Object 用于首先增加一个数字。请注意,我使用的部分 RNG 代码基于Scala 函数式编程中的“随机数生成器”课程。

trait NumberInc {
  def currentInt: Int
  def nextInt: (Int, NumberInc)
}

object NumberInc {
  def simple(seed: Int): NumberInc = new NumberInc {
    def currentInt: Int = seed
    def nextInt: (Int, NumberInc) = (seed + 1, simple(seed + 1))
  }
}

然后,在我的“Test”对象的 foo() 方法中,我执行以下逻辑:

def foo() { 

  var numberInc = NumberInc.simple(0)

  def bar() = { 
     baz(numberInc.currentInt)
     var (_, numberInc) = numberInc.nextInt /* Error Line */

  }

}

但是我在上面的错误行中遇到了这个错误。

[error] forward reference extends over definition of variable numberInc

我发现这个答案很有帮助,但我不确定它如何应用于我的上述代码。

4

2 回答 2

2

当您调用该方法numberInc.nextInt时,它没有引用NumberInc上面几行定义的实例。它正在尝试进行递归定义,因为您对新变量使用了相同的名称。如果你删除整行var numberInc = NumberInc.simple(0),你会得到同样的错误。

于 2013-10-24T13:39:41.967 回答
0

您定义了一个名为 numberInc 的新变量,而不是更改旧变量。这是解决此问题的一种方法。

trait NumberInc {
  def currentInt: Int
  def nextInt: NumberInc
}

object NumberInc {
  def simple(seed: Int): NumberInc = new NumberInc {
    def currentInt: Int = seed
    def nextInt: NumberInc = simple(seed + 1)
  }
}

def foo() { 
  var numberInc = NumberInc.simple(0)

  def bar() = { 
     baz(numberInc.currentInt)
     numberInc = numberInc.nextInt
  }
}

但是你也可以使用一个可迭代的来代替。

def foo() { 
  var iter = Iterator.from(0).toIterable

  def bar() = { 
     baz(iter.head)
     iter = iter.tail
  }
}
于 2013-10-24T14:31:22.417 回答