代码之家  ›  专栏  ›  技术社区  ›  horseyguy

Ruby生成器与Python生成器

  •  20
  • horseyguy  · 技术社区  · 15 年前

    我一直在研究Ruby和Python生成器(称为 Enumerators

    不过,我注意到的一个区别是Python生成器支持 close() 关闭()

    在生成器函数暂停的点引发GeneratorExit。如果generator函数随后引发StopIteration(通过正常退出,或由于已关闭)或GeneratorExit(通过未捕获异常),close将返回其调用方。“

    鲁比有什么好理由吗 枚举器 关闭() 方法?还是意外

    我还发现了 枚举器 rewind() 方法但是Python生成器没有…这也有原因吗?

    3 回复  |  直到 15 年前
        1
  •  7
  •   wberry    13 年前

    这个 documentation for the rewind method 在细节上有点缺乏。但为了“重新启动”,发电机必须做两件事之一:

    • 重置其内部状态,使相同的输出重复,而不会产生其他不必要的副作用

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

    rewind 方法必须是可选的,并且不总是由具体的枚举器类支持。所以如果Python设计者重视 Liskov substitution principle

        2
  •  2
  •   raggi    15 年前

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

        3
  •  1
  •   Community CDub    8 年前

    Ruby的枚举器在内部使用StopIteration类,请参见 How do Enumerators work in Ruby 1.9.1?

    应该

    推荐文章