2016-09-25 53 views
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) 
     } 
    } 
    } 

回答

1

第一次迭代后,迭代器通过source.getLines()返回false为hasNext,这意味着空迭代返回。 Iterator.continually()持续评估source.getLines()期望下一个迭代器,但它会继续返回空的迭代器。然后它形成一个无限循环。

+0

有没有更好的方式来写它,而不是像我在工作代码中显示的那样重新初始化流? –

+1

创建一个全部元素的列表(通过'source.getLines()。toList')然后'Iterator.continually(theList).flatten'。这种方式只能用于内存时才能使用。否则,重新初始化流是一种方式。 – kawty