Ruby中的迭代器詳解

2022-09-26 06:03:12 字數 4045 閱讀 3261

d瓜哥最近想做乙個**,另外,老早就有學習一門動態語言的想程式設計客棧法,滿足著兩個條件的程式語言中,ruby、python是最合適的兩種語言。現在ruby on rails如日中天,光芒萬丈!所以,就選定了ruby,從零開始學習。

前天看了ruby的迭代器,對於我這個只學過j**a、c/c++等的人來說,絕對是眼前一亮的感覺!而且是光彩奪目:沒想到迭代器還可以這麼玩,太簡練太方便而且特別強大!然後,d瓜哥就迫不及待的想寫一篇文章給大家介紹介紹ruby的迭代器!

迭代器簡介

先簡單介紹一下迭代器。

1.乙個ruby迭代器就是乙個簡單的能接收**塊的方法(比如each這個方法就是乙個迭代器)。特徵:如果乙個方法裡包含了yield呼叫,那這個方法肯定是迭代器;

2.迭代器方法和塊之間有如下傳遞關係:塊被當成乙個特殊引數傳給迭代器方法,而迭代器方法內部在使用yield呼叫**塊時可將引數值傳入塊;

3.實際上,迭代器的功能就是一種**!迭代器方法所屬的類只負責遍歷需要遍歷的元素,而對元素所做的處理則通過****塊來實現;

4.ruby中的容器物件(如陣列、range和hash物件等)都包含了兩個簡單的迭代器,分別是each和collect。each可以認為是最簡單的迭代器,它會對集合的每個元素呼叫塊。 collect,將容器中的元素傳遞給乙個塊,在塊中處理後返回乙個包含處理結果的新陣列;

迭代器詳解

ruby中的迭代器可以說五花八門,下面我們從字串、數字、陣列、map、檔案、目錄等幾個方面來簡單介紹一下ruby的迭代器。

字串迭代器

在j**a中,字串型別的資料沒有迭代器。所以,如果需要「遍歷」字串,需要將字串做一些其他處理才行。但是,在ruby中就有。下面,我們通過**來演示一下:

複製** **如下:

str = "ab程式設計客棧c"

str.each_byte ;  #

# 輸出如下:(為了和**區別,d瓜哥在輸出前面人為地加了#。)

# 以下的輸出展示,處理方式相同。

#>a>b>c

each_byte 是字串中用於處理每個位元組的迭代器。每個位元組都會代入塊引數 c 中。

ruby中,不僅有用於位元組的迭代器,還有用於每行的迭代器。示例如下:

複製** **如下:

str = "abc\nefg\nhijk"

str.each_line

# 輸出如下:

#abc

#efg

#hijk

怎麼樣,是不是被ruby簡練但強大的迭代器所折服?!好戲還在後面,接著向下看。

數字迭代器

在ruby中,「一切皆為物件」,甚至數字也是物件。這點和j**a不一樣。所以,對字的迭代器,對於我這個j**a程式猿也是聞所未聞。讓我們寫兩個示例,管窺一二。

第乙個場景:對某段**進行n(比如5)次操作。在j**a中,需要寫個迴圈,但是在ruby中,只需要呼叫一下times方法即可。**如下:

複製** **如下:

5.times # 真的就這麼簡單

# 輸出如下:

#i love

#i love

#i love

#i love

#i love

第二個場景:求1到5的數字之和。這個也特別簡單:

複製** **如下:

sum = 0

(1..5).each

print "sum="+sum.to_s

如果使用upto函式,還可以這樣寫:

複製** **如下:

sum = 0

1.upto(5)

print "sum="+sum.to_s

有時,我們的步進不一定是1,可能是2,例如奇數和。這種情況下,可以使用step函式。**如下:

複製** **如下:

sum = 0  

1.step(5, 2) do |y| # step函式第二個引數是步進。

sum += y  

end 

print "sum="+sum.to_s

感覺有點扯遠了。下面,我們講講陣列相關的迭代器。

陣列迭代器

見識過了數字相關的迭代器,我們再看看陣列相關的迭代器。

第乙個場景:便利陣列並輸出每個元素。直接上**:

複製** **如下:

languages = ['ruby', 'j**ascript', 'j**a']

languages.each_with_index do |lang, i|

puts "#, i love #!"

end#輸出如下:

#0, i love ruby!

#1, i love j**ascript!

#2, i love j**a!

有時,我們需要對陣列的元素做出乙個挑選,這時可以這樣幹:

複製** **如下:

# 找出符合條件的值

b = [1,2,3].find_all

# b的值是 [1,3]

有時,我們需要刪除陣列中的某些值。這時:

複製** **如下:

# 迭代並根據條件刪除

a = [51, 101, 256]

a.delete_if

# a的值是 [51]

再來乙個例子:

複製** **如下:

# 找出最長字串find the longest word

longest = ["cat", "sheep", "bear"].inject do |memo,word|

( memo.length > word.length )? memo : word

endputs longest

#輸出如下:

#sheep

map迭代器

在j**a中,如果相對map使用迭代器,必須把map轉化成list型別的容器才行。但是,在ruby中,有直接針對map的迭代器,很好很方便:

複製** **如下:

sum = 0

outcome =

outcome.each

print "sum="+sum.to_s

甚至,我們還可以這樣:

複製** **如下:

sum = 0

outcome =

outcome.each

print "sum="+sum.to_s

這裡說明一下:上述程式使用了pair[1]讀取map的值,如果要讀取map的鍵時則寫成pair[0]。

如果需要輸出map的key,可以這樣:

複製** **如下:

outcome =

outcome.each_key do |k|

puts k

end如果需要輸出map的value,則可以這樣:

複製** **如下:

outcome =

outcome.each_value do |v|

puts v

end檔案迭代器

實在是沒有想到,對於檔案,ruby也有迭代器可用。如下:

複製** **如下:

f = file.open("sample.txt")

f.each

f.close

其實,我們可以使用**塊來進行同樣的操作:

複製** **如下:

file.open("str.rb", "r") do |file|

file.each

end使用**塊,不需要手動close。這個推薦!

目錄迭代器

很多時候,我們需要列出某個目錄下的檔案列表,設定對每個檔案進行操作,這時也需要迭代器。ruby也考慮到了:

複製** **如下:

dir.foreach("c://") do |file|  # 請根據自己的系統型別,做適當的修改

puts file

end#輸出yjflzdxx太多,就不貼結果了。可以自己執行一下看看

結尾通過上面的介紹可以看出,j**a和ruby相比,在迭代器方面簡直是弱爆了!當然,d瓜哥剛剛開始學習ruby,文中有不當甚至解釋錯誤的地方,勞煩指出,d瓜哥會盡快改正的。

本文標題: ruby中的迭代器詳解

本文位址: /jiaoben/ruby/113088.html

ruby的迭代器

1 陣列的迭代器 ary 1,2,3,4,5,6,7 ary.each 或者可以用each do end的寫法 ary 1,2,3,4,5,6,7 ary.each do x puts x end 也可以用each with index來獲取每次訪問陣列的index ary 1,2,3,4,5,6,...

簡單的ruby 迭代器

由於工作關係,一直沒有時間學習ruby,最近終於有時間可以學習下ruby了,同時也在csdn開了blog,藉此記錄一下自己學習的心得,當然不僅僅是ruby,近幾年動態語言非常的火熱,而我個人也非常喜歡動態語言的簡潔,可惜一直都沒什麼時間花在上面,如果可能除了ruby,我也想花花時間在其他的語言上,例...

簡要說明Ruby中的迭代器

迭代器是集合支援的方法。儲存一組資料成員的物件稱為集合。在 ruby 中,陣列和雜湊可以稱之為集合。迭代器返回集合的所有元素,乙個接著乙個。在這裡我們將討論兩種迭代器,each 和 collect。ruby each 迭代器 each 迭代器返回陣列或雜湊的所有元素。語法collection.eac...