在我的Test.scala中,我定义了一个Trait和Object来首先递增一个数字。请注意,我正在使用部分RNG代码基于Functional Programming in 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
我发现此answer有用,但我不确定它是如何适用于我的上述代码的。
答案 0 :(得分:2)
当您调用方法numberInc.nextInt
时,它不会引用上面几行定义的NumberInc
实例。它正在尝试执行递归定义,因为您为新变量使用了相同的名称。如果删除整行var numberInc = NumberInc.simple(0)
,则会出现相同的错误。
答案 1 :(得分: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
}
}