首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby生成器与Python生成器

Ruby生成器与Python生成器
EN

Stack Overflow用户
提问于 2010-09-25 17:25:40
回答 3查看 4.8K关注 0票数 20

我一直在研究Ruby和Python生成器(在Ruby中称为Enumerators )之间的异同,据我所知,它们几乎是等价的。

然而,我注意到的一个不同之处是,Python生成器支持close()方法,而Ruby生成器则不支持。在Python中,close()方法据说执行以下操作:

在暂停生成器函数时引发GeneratorExit。如果生成器函数随后引发StopIteration (通过正常退出,或由于已经关闭)或GeneratorExit (通过不捕获异常),则关闭将返回给调用方。

为什么Ruby Enumerators不支持close()方法有很好的原因吗?或者是意外的疏忽?

我还发现Ruby Enumerators支持rewind()方法,但是not...is生成器也有理由这么做吗?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2012-06-28 18:02:02

这个倒带方法的文档在细节上有点缺乏。但是为了“重新开始”,发电机必须做两件事中的一件:

  • 记住它的全部输出,重复该输出一次重绕,然后继续它以前所做的工作。
  • 重置其内部状态,使相同的输出被重复,而不会产生其他不必要的副作用。

其中的第二个并不总是可能的;例如,如果生成器从网络中发出字节缓冲区,输出就不完全是内部状态的函数。但是,任何使用第一种技术的生成器都必须在使用时在内存中建立一个越来越大的缓冲区。这类生成器与列表相比几乎没有什么性能效益。

因此,我的结论是,Ruby方法必须是可选的,而不是总是被具体的枚举器类所支持。因此,如果Python对Liskov代换原理进行了评估,这将导致他们在所有生成器中不需要这样的方法。

票数 7
EN

Stack Overflow用户

发布于 2010-09-26 01:25:24

生成器是基于堆栈的,Ruby的枚举器通常是专门化的(在解释器级别),而不是基于堆栈的。

票数 2
EN

Stack Overflow用户

发布于 2010-09-29 19:49:55

Ruby的枚举器内部使用StopIteration类,请参见枚举器是如何在Ruby1.9.1中工作的?

(如果您在每次调用中都使用它,它就会被包装)。所以我想说他们是一个相当亲密的人。尽管如此,我不知道枚举数上的一个封闭方法应该做些什么,也许exactly...cleanup?(Python的生成器可能会从倒带中受益--注意,在Ruby中,一些枚举器不会响应回退,所以当您调用该方法时,它们会引发异常)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3794762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档