0

我在一个文件中有一组名称。我需要实现一个不断迭代它们的生成器。但是,代码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 for hasNext,这意味着一个空的迭代器。 Iterator.continually()不断评估source.getLines()期待下一个迭代器,但它继续返回一个空迭代器。然后它形成一个无限循环。

于 2016-09-25T12:39:24.810 回答