Swift。 GeneratorOf<T> 生成函数没有 return 正确的生成器
Swift. GeneratorOf<T> generate function doesn't return proper generator
我使用游乐场来玩一些序列和生成器。
所以我创建了 returns 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)
}
GeneratorOf<T>.generate()
returns a copy of itself,并且在您的代码中,它的每个 copy 共享对一个 i
[=17= 的相同引用]
所以,当你在countDownGen
用完之后再做countDownGen2 = countDownGen.generate()
,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)
}
我使用游乐场来玩一些序列和生成器。 所以我创建了 returns 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)
}
GeneratorOf<T>.generate()
returns a copy of itself,并且在您的代码中,它的每个 copy 共享对一个 i
[=17= 的相同引用]
所以,当你在countDownGen
用完之后再做countDownGen2 = countDownGen.generate()
,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)
}