作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有一些 existingIterator
迭代任意类型的元素T
.我现在想要实现的是从 existingIterator
派生一个新的迭代器具有修改的行为。想想这样的例子:
existingIterator.take(n)
. existingIterator.map(modifier)
existingIterator.filter(predicate)
. for x in existingIterator.filter(something)
.map(modifier)
.take(10):
...
take(n)
功能为例。我的第一种方法是使用常规泛型
iterator
:
iterator infinite(): int {.closure.} =
var i = 0
while true:
yield i
inc i
iterator take[T](it: iterator (): T, numToTake: int): T {.closure.} =
var i = 0
for x in it():
if i < numToTake:
yield x
inc i
for x in infinite.take(10):
echo x
template take[T](it: iterator(): T, numToTake: int): expr {.immediate.} =
var i = 0
iterator tmp(): type(it()) =
for item in it:
if i < numToTake:
yield item
inc i
tmp
for x in infinite.take(10)
我得到:
`Error: type mismatch: got (iterator (): int{.closure, gcsafe, locks: 0.})`
()
实际“调用”迭代器,但它仍然不起作用。所以它归结为一个问题:我应该如何从模板构造/返回迭代器?
最佳答案
问题在于
for x in infinite.take(10):
echo x
infinite.take(10)
,我们也可以写成
take(infinite, 10)
.不像
Sather , Nim 没有
once
它的迭代器的参数,因此没有办法区分每个循环应该评估一次的参数和每个循环迭代应该评估一次的参数。
infinite
的新实例每次循环时都会创建具有新环境的迭代器。这将使
infinite
一次又一次地从零开始。
let iter = ...; iter(someArgument); iter(someOtherArgument)
.因此,我不确定我们是在查看错误还是此处的预期行为。
infinite
来解决此问题至
take
直接,但使用
let
第一的。您的
take
中还有一个错误循环不会终止的代码,您还需要修复它。生成的代码将类似于:
iterator infinite(): int {.closure.} =
var i = 0
while true:
yield i
inc i
iterator take[T](it: iterator (): T, numToTake: int): T {.closure.} =
var i = 0
for x in it():
if i >= numToTake:
break
yield x
inc i
let inf = infinite
for x in inf.take(10):
echo x
infinite
,这可以通过将迭代器包装在模板或过程中来完成,例如:
template infiniteFrom(x: int): (iterator (): int) =
(iterator (): int =
var i = x
while true:
yield i
inc i)
...
let inf = infiniteFrom(1)
for x in inf.take(10):
echo x
关于templates - 尼姆 : How to wrap/derive an iterator from another iterator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29588345/
我是一名优秀的程序员,十分优秀!