Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 正向引用扩展了变量的定义_Scala - Fatal编程技术网

Scala 正向引用扩展了变量的定义

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

在Test.scala中,我定义了一个特征和对象,用于先递增一个数字。请注意,我使用的是基于中“随机数生成器”课程的部分RNG代码

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

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