无限期挂起的圆形生成器

Circular Generators hanging indefinately

我在文件中有一组名称。我需要实现一个不断迭代它们的生成器。但是,代码在第一次通过后无限期地挂在 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)
      }
    }
  }

第一次迭代后,return由 source.getLines() return 编辑的迭代器对于 hasNext 为 false,这意味着一个空迭代器。 Iterator.continually() 持续评估 source.getLines() 期待下一个迭代器,但它继续 return 一个空迭代器。然后形成死循环