迭代器簡介數組
先簡單介紹一下迭代器。函數
1.一個Ruby迭代器就是一個簡單的能接收代碼塊的方法(好比each這個方法就是一個迭代器)。特徵:若是一個方法裏包含了yield調用,那這個方法確定是迭代器;spa
2.迭代器方法和塊之間有以下傳遞關係:塊被當成一個特殊參數傳給迭代器方法,而迭代器方法內部在使用yield調用代碼塊時可將參數值傳入塊;.net
3.實際上,迭代器的功能就是一種回調!迭代器方法所屬的類只負責遍歷須要遍歷的元素,而對元素所作的處理則經過回調代碼塊來實現;code
4.Ruby中的容器對象(如數組、Range和Hash對象等)都包含了兩個簡單的迭代器,分別是each和collect。each能夠認爲是最簡單的迭代器,它會對集合的每一個元素調用塊。 collect,將容器中的元素傳遞給一個塊,在塊中處理後返回一個包含處理結果的新數組;對象
迭代器詳解ip
Ruby中的迭代器能夠說五花八門,下面咱們從字符串、數字、數組、Map、文件、目錄等幾個方面來簡單介紹一下Ruby的迭代器。字符串
字符串迭代器it
在Java中,字符串類型的數據沒有迭代器。因此,若是須要「遍歷」字符串,須要將字符串作一些其餘處理才行。可是,在Ruby中就有。下面,咱們經過代碼來演示一下:io
# 輸出以下:(爲了和代碼區別,D瓜哥在輸出前面人爲地加了#。)
# 如下的輸出展現,處理方式相同。
#>a>b>c
each_byte 是字串中用於處理每一個字節的迭代器。每一個字節都會代入塊參數 c 中。
Ruby中,不只有用於字節的迭代器,還有用於每行的迭代器。示例以下:
# 輸出以下:
#abc
#efg
#hijk
怎麼樣,是否是被Ruby簡練但強大的迭代器所折服?!好戲還在後面,接着向下看。
數字迭代器
在Ruby中,「一切皆爲對象」,甚至數字也是對象。這點和Java不同。因此,對字的迭代器,對於我這個Java程序猿也是聞所未聞。讓咱們寫兩個示例,管窺一二。
第一個場景:對某段代碼進行N(好比5)次操做。在Java中,須要寫個循環,可是在Ruby中,只須要調用一下times方法便可。代碼以下:
# 輸出以下:
#I love http://www.jb51.net/
#I love http://www.jb51.net/
#I love http://www.jb51.net/
#I love http://www.jb51.net/
#I love http://www.jb51.net/
第二個場景:求1到5的數字之和。這個也特別簡單:
若是使用upto函數,還能夠這樣寫:
有時,咱們的步進不必定是1,多是2,例如奇數和。這種狀況下,可使用step函數。代碼以下:
感受有點扯遠了。下面,咱們講講數組相關的迭代器。
數組迭代器
見識過了數字相關的迭代器,咱們再看看數組相關的迭代器。
第一個場景:便利數組並輸出每一個元素。直接上代碼:
#輸出以下:
#0, I love Ruby!
#1, I love Javascript!
#2, I love Java!
有時,咱們須要對數組的元素作出一個挑選,這時能夠這樣幹:
有時,咱們須要刪除數組中的某些值。這時:
再來一個例子:
#輸出以下:
#sheep
Map迭代器
在Java中,若是相對Map使用迭代器,必須把Map轉化成List類型的容器才行。可是,在Ruby中,有直接針對Map的迭代器,很好很方便:
甚至,咱們還能夠這樣:
這裏說明一下:上述程序使用了pair[1]讀取Map的值,若是要讀取Map的鍵時則寫成pair[0]。
若是須要輸出Map的Key,能夠這樣:
若是須要輸出Map的value,則能夠這樣:
文件迭代器
實在是沒有想到,對於文件,Ruby也有迭代器可用。以下:
其實,咱們可使用代碼塊來進行一樣的操做:
使用代碼塊,不須要手動close。這個推薦!
目錄迭代器
不少時候,咱們須要列出某個目錄下的文件列表,設置對每一個文件進行操做,這時也須要迭代器。Ruby也考慮到了:
#輸出太多,就不貼結果了。能夠本身運行一下看看