[英]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.