我一直在研究Ruby和Python生成器(在Ruby中称为Enumerators
)之间的异同,据我所知,它们几乎是等价的。
然而,我注意到的一个不同之处是,Python生成器支持close()
方法,而Ruby生成器则不支持。在Python中,close()
方法据说执行以下操作:
在暂停生成器函数时引发GeneratorExit。如果生成器函数随后引发StopIteration (通过正常退出,或由于已经关闭)或GeneratorExit (通过不捕获异常),则关闭将返回给调用方。
为什么Ruby Enumerators
不支持close()
方法有很好的原因吗?或者是意外的疏忽?
我还发现Ruby Enumerators
支持rewind()
方法,但是not...is生成器也有理由这么做吗?
谢谢
发布于 2012-06-28 18:02:02
这个倒带方法的文档在细节上有点缺乏。但是为了“重新开始”,发电机必须做两件事中的一件:
其中的第二个并不总是可能的;例如,如果生成器从网络中发出字节缓冲区,输出就不完全是内部状态的函数。但是,任何使用第一种技术的生成器都必须在使用时在内存中建立一个越来越大的缓冲区。这类生成器与列表相比几乎没有什么性能效益。
因此,我的结论是,Ruby方法必须是可选的,而不是总是被具体的枚举器类所支持。因此,如果Python对Liskov代换原理进行了评估,这将导致他们在所有生成器中不需要这样的方法。
发布于 2010-09-26 01:25:24
生成器是基于堆栈的,Ruby的枚举器通常是专门化的(在解释器级别),而不是基于堆栈的。
发布于 2010-09-29 19:49:55
Ruby的枚举器内部使用StopIteration类,请参见枚举器是如何在Ruby1.9.1中工作的?
(如果您在每次调用中都使用它,它就会被包装)。所以我想说他们是一个相当亲密的人。尽管如此,我不知道枚举数上的一个封闭方法应该做些什么,也许exactly...cleanup?(Python的生成器可能会从倒带中受益--注意,在Ruby中,一些枚举器不会响应回退,所以当您调用该方法时,它们会引发异常)。
https://stackoverflow.com/questions/3794762
复制相似问题