簡體   English   中英

Ruby生成器與Python生成器

[英]Ruby generators vs Python generators

我一直在研究Ruby和Python生成器(在Ruby中稱為Enumerators器)之間的相似之處/差異,並且據我所知,它們幾乎相同。

然而,我注意到的一個區別是Python Generators支持close()方法,而Ruby Generators則不支持。 從Python文檔中可以看出close()方法執行以下操作:

在生成器功能暫停的位置引發GeneratorExit。 如果生成器函數然后引發StopIteration(通過正常退出,或者由於已經關閉)或GeneratorExit(通過不捕獲異常),則關閉返回其調用者。

Ruby Enumerators不支持close()方法有充分的理由嗎? 還是意外遺漏?

我還發現Ruby Enumerators支持rewind()方法,而Python生成器卻沒有......這也是有原因的嗎?

謝謝

這個關於倒帶方法的文檔在細節上有點稀缺。 但是為了“重新開始”,發電機必須做以下兩件事之一:

  • 記住它的完整輸出,一旦重繞就重復輸出,然后恢復之前的操作
  • 以一種導致相同輸出重復的方式重置其內部狀態,而沒有其他不需要的副作用

其中第二個並非總是可行; 例如,如果生成器從網絡發出字節緩沖區,則輸出不完全是內部狀態的函數。 但是,任何使用第一種技術的生成器必須在使用時在內存中構建越來越大的緩沖區。 與列表相比,此類生成器幾乎沒有性能優

因此,我得出結論,Ruby rewind方法必須是可選的,並不總是由具體的枚舉器類支持。 因此,如果Python設計者重視Liskov替換原則 ,那將導致他們不要在所有生成器中都需要這樣的方法。

生成器是基於堆棧的,Ruby的枚舉器通常是專用的(在解釋器級別)而不是基於堆棧的。

Ruby的Enumerator內部使用StopIteration類,請參閱Enumerators如何在Ruby 1.9.1中工作?

(如果您在每次通話中使用它,它就會被包裝)。 所以我會說他們相當接近。 話雖這么說,我不確定調查員該做什么樣的密切方法,確切地說......也許是清理工作? (Python的生成器可能會受益於倒帶 - 請注意,在Ruby中,一些枚舉器不響應倒帶,因此當您調用該方法時它們會引發異常)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM