我使用游乐场玩序列和生成器。 所以我创建了一个返回GeneratorOf结构的函数,该结构假设实现了GeneratorType和SequenceType。我希望generate会给我一个新的完整的生成器,我可以再次遍历。但它没有为我的countDownGen2。
我想我误解了一些事情。
这里有什么问题?以及如何正确使用GeneratorOf?
func countDown(start: Int) -> GeneratorOf<Int>
{
var i = start
return GeneratorOf {return i < 0 ? nil : i-- }
}
var countDownGen = countDown(10)
for i in countDownGen
{
println(i)
}
var countDownGen2 = countDownGen.generate()
for i in countDownGen2
{
println(i)
}
答案 0 :(得分:3)
GeneratorOf<T>.generate()
returns a copy of itself,在您的代码中,每个副本与一个i
因此,当countDownGen2 = countDownGen.generate()
用尽后countDownGen
时,countDownGen2
也已用尽。
你应该做的是:
func countDown(start: Int) -> SequenceOf<Int> {
return SequenceOf { () -> GeneratorOf<Int> in
var i = start
return GeneratorOf { return i < 0 ? nil : i-- }
}
}
let countDownSeq = countDown(10)
for i in countDownSeq {
println(i)
}
for i in countDownSeq {
println(i)
}
let countDownSeq2 = countDownSeq
for i in countDownSeq2 {
println(i)
}