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...