【发布时间】:2011-04-17 05:21:34
【问题描述】:
我一直在研究 Ruby 和 Python 生成器(在 Ruby 中称为 Enumerators)之间的相似之处/不同之处,据我所知,它们几乎是等价的。
然而,我注意到的一个区别是 Python 生成器支持 close() 方法,而 Ruby 生成器不支持。在 Python 文档中,close() 方法据说执行以下操作:
在生成器函数暂停的位置引发 GeneratorExit。如果生成器函数随后引发 StopIteration(通过正常退出,或由于已被关闭)或 GeneratorExit(通过未捕获异常),则 close 返回其调用者。"
Ruby Enumerators 不支持 close() 方法有充分的理由吗?或者是偶然的
遗漏?
我还发现 Ruby Enumerators 支持 rewind() 方法,但 Python 生成器不支持...这也有原因吗?
谢谢
【问题讨论】:
-
很好奇,但我不明白你会如何使用它:你能举个例子吗?
-
@Andrew Vit:这可用于清理生成器持有的资源——数据库连接、文件等。它还将阻止从代码的其他部分对其
next或send方法的任何进一步调用。例如,您可以调用close,从众多消费者中的一个指示其他消费者已找到所需的值。 -
@intuited,Python 的
close()实际上是常用的吗?我想我在某处读到它被 python 社区认为是“神秘的”并且没有真正使用。 -
close()是 API 的一部分,用于与生成器进行双向通信,将其变成“协程”。您可以在python.org/dev/peps/pep-0342 中阅读有关它的信息。 Ruby 有这个概念吗?
标签: python ruby generator enumerator