ruby中迭代器列舉器的理解

c3tc3tc3t發表於2015-12-12

參考《ruby程式語言》5.3迭代器和可列舉物件

迭代器
一個迭代器是一個方法,這個方法裡面有yield語句,這個方法裡的yield語句,與傳遞給這個方法的塊進行資料傳輸

yield將資料傳給程式碼快,程式碼塊再把資料傳輸給yield

each方法就是一個迭代器,裡面有yield語句

列舉器
1 一個列舉器是Enumerable::Enumerator的一個物件,Enumerable是一個模組
2 使用列舉器 1.8的時候需要 require 'enumerator',在2.1就不用了
3 可以通過new來例項化一個列舉器,但是通常使用Object類的to_enum或enum_for,返回一個列舉器,這個列舉器只是簡單呼叫目標物件的each方法,這句話意思就是說例如 a.to_enum執行後返回一個列舉器,這個列舉器會呼叫a物件的each方法


4 當給to_enum傳遞一個符號引數和其他引數的時候,或者使用enum_for語義上更好例如
a.enum_for(:bbb,arg1,arg2),這個:bbb是一個迭代器方法來自a物件,enum_for方法返回一個列舉器,這個列舉器有一個each方法,這個each方法呼叫上面a物件的迭代器方法就是這個:bbb方法,把其餘引數arg1,arg2傳遞給那個迭代器:bbb


5使用場景,當一個類A ,include Enumerable時候。A的例項物件就具備了Enumerable裡的方法,當我們 a = A.new後, a.enum_for(:xxx)就返回了一個列舉器,這個列舉器的each方法呼叫這個xxx方法,而這個xxx方法就是Enumerable裡的一個迭代器方法或者別的方法,這樣就可以傳遞一個程式碼塊給這個xxx迭代器進行一些運算

 

6 在1.9,2.1中應該也是一樣,不需要顯示的呼叫to_enum或者enum_for,當不用程式碼塊呼叫內建的迭代器(內建迭代器指的是times,upto,downto,step.each及Enumerable的相關方法)的時候,就是指a.enum_for(:each)這句執行但是沒有傳遞程式碼快,不傳遞程式碼快的話就自動返回一個迭代器
a.each 這個就會返回一個列舉器

相關文章