0

ファイルに一連の名前があります。それらを継続的に反復処理する Generator を実装する必要があります。ただし、コードはif (iter.hasNext)最初のパスの後、無期限にハングします。

遺伝子コード

var asStream = getClass.getResourceAsStream("/firstnames/female/en_US_sample.txt")

var source: BufferedSource = Source.fromInputStream(asStream)
var iter: Iterator[String] = Iterator.continually(source.getLines()).flatten

val genLastName: Gen[String] = {
  genCannedData
}

def genCannedData: Gen[String] = {
    println("Generating names: " + iter)
    Gen.delay {
      if (iter.hasNext) {
        println("In if")
        Gen.const(iter.next)
      }
      else {
        println("In else")
        Gen.const(iter.next)
      }
    }
}

サンプル プロパティ テスト

property("FirstNames") = {
    forAll(genLastName) {
      a => {
        println(a)
        a == a
      }
    }
  }

en_US_sample.txt ファイルの内容

Abbie
Abby
Abigail
Ada
Adah

編集-一時的な作業コード

次のコードは、イテレータを再作成すると機能しますが、なぜIterator.continuallyハングしているのか疑問に思っていましたか?

def genCannedData: Gen[String] = {
    Gen.delay {
      if (iter.hasNext) {
        Gen.const(iter.next)
      }
      else {
        asStream = getClass.getResourceAsStream("/firstnames/female/en_US_sample.txt")
        source = Source.fromInputStream(asStream)
        iter = source.getLines()
        Gen.const(iter.next)
      }
    }
  }
4

1 に答える 1

1

最初の反復の後、 によってsource.getLines()返される反復子は に対して false を返しhasNextます。これは、空の反復子を意味します。 Iterator.continually()次の反復子を期待して継続的に評価source.getLines()しますが、空の反復子を返し続けます。その後、無限ループを形成します。

于 2016-09-25T12:39:24.810 に答える