前向引用扩展了变量的定义

时间:2013-10-24 13:09:27

标签: scala

在我的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有用,但我不确定它是如何适用于我的上述代码的。

2 个答案:

答案 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
  }
}