Scala 正向引用扩展了变量的定义
在Test.scala中,我定义了一个特征和对象,用于先递增一个数字。请注意,我使用的是基于中“随机数生成器”课程的部分RNG代码 然后,在我的“Test”对象的foo()方法中,我执行以下逻辑:Scala 正向引用扩展了变量的定义,scala,Scala,在Test.scala中,我定义了一个特征和对象,用于先递增一个数字。请注意,我使用的是基于中“随机数生成器”课程的部分RNG代码 然后,在我的“Test”对象的foo()方法中,我执行以下逻辑: def foo() { var numberInc = NumberInc.simple(0) def bar() = { baz(numberInc.currentInt) var (_, numberInc) = numberInc.nextInt /* Err
def foo() {
var numberInc = NumberInc.simple(0)
def bar() = {
baz(numberInc.currentInt)
var (_, numberInc) = numberInc.nextInt /* Error Line */
}
}
但是我在上面的错误线上得到了这个错误
[error]正向引用扩展了变量numberInc的定义
我发现这很有帮助,但我不确定它如何应用于我的上述代码。当您调用方法numberInc.nextInt
时,它没有引用上面几行定义的numberInc
实例。它试图进行递归定义,因为您对新变量使用了相同的名称。如果删除整行var numberInc=numberInc.simple(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
}
}
但是你也可以用iterable来代替
def foo() {
var iter = Iterator.from(0).toIterable
def bar() = {
baz(iter.head)
iter = iter.tail
}
}
什么是方法baz
?你所说的是什么意思?你对新变量使用了相同的名称
?您能告诉我如何解决这个问题并使用numberInc
作为变量吗?例如,只需将行更改为var(\uuu,numberInc2)=numberInc.nextInt
。但是,我将多次调用bar()
,因此我想使用当前的numberInc对象。使用(u,numberInc2)=numberInc.nextInt
不会让我将numberInc
重新分配给下一个numberInc对象,对吗?我们可能会从条返回下一个numberInc
?然后将numberInc
分配给bar
的结果……仅仅基于伪代码很难说。
def foo() {
var iter = Iterator.from(0).toIterable
def bar() = {
baz(iter.head)
iter = iter.tail
}
}