Ruby生成器与Python生成器

hor*_*guy 20 ruby python generator enumerator

我一直在研究Ruby和Python生成器之间的相似之处/差异(Enumerators在Ruby中称为),并且据我所知,它们几乎相同.

然而,我注意到的一个区别是Python Generators支持一种close()方法,而Ruby Generators则不支持.从Python文档中可以看出该close()方法执行以下操作:

在生成器功能暂停的位置引发GeneratorExit.如果生成器函数然后引发StopIteration(通过正常退出,或者由于已经关闭)或GeneratorExit(通过不捕获异常),则关闭返回其调用者.

Ruby Enumerators不支持该close()方法有充分的理由吗?还是意外遗漏?

我还发现Ruby Enumerators支持一种rewind()方法,而Python生成器却没有......这也是有原因的吗?

谢谢

wbe*_*rry 7

这个关于倒带方法的文档在细节上有点稀缺.但是为了"重新开始",发电机必须做以下两件事之一:

  • 记住它的完整输出,重新输出后重复输出,然后恢复之前的操作
  • 以一种导致相同输出重复的方式重置其内部状态,而没有其他不需要的副作用

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

因此,我得出结论,Ruby rewind方法必须是可选的,并不总是由具体的枚举器类支持.因此,如果Python设计者重视Liskov替换原则,那将导致他们不要在所有生成器中都需要这样的方法.


rag*_*ggi 2

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