0

私の Test.scala では、最初に数値をインクリメントするための Trait と Object を定義しました。Scala での関数型プログラミングの「乱数ジェネレーター」のレッスンに基づいて、RNG コードの一部を使用していることに注意してください。

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 という名前の新しい変数を定義しました。これを修正する1つの方法があります。

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
  }
}
于 2013-10-24T14:31:22.417 に答える