D瓜哥最近想做一個網(wǎng)站,另外,老早就有學(xué)習(xí)一門動態(tài)語言的想法,滿足著兩個條件的編程語言中,Ruby、Python是最合適的兩種語言?,F(xiàn)在Ruby on Rails如日中天,光芒萬丈!所以,就選定了Ruby,從零開始學(xué)習(xí)。
前天看了Ruby的迭代器,對于我這個只學(xué)過Java、C/C++等的人來說,絕對是眼前一亮的感覺!而且是光彩奪目:沒想到迭代器還可以這么玩,太簡練太方便而且特別強大!然后,D瓜哥就迫不及待的想寫一篇文章給大家介紹介紹Ruby的迭代器!
迭代器簡介
先簡單介紹一下迭代器。
1.一個Ruby迭代器就是一個簡單的能接收代碼塊的方法(比如each這個方法就是一個迭代器)。特征:如果一個方法里包含了yield調(diào)用,那這個方法肯定是迭代器;
2.迭代器方法和塊之間有如下傳遞關(guān)系:塊被當(dāng)成一個特殊參數(shù)傳給迭代器方法,而迭代器方法內(nèi)部在使用yield調(diào)用代碼塊時可將參數(shù)值傳入塊;
3.實際上,迭代器的功能就是一種回調(diào)!迭代器方法所屬的類只負(fù)責(zé)遍歷需要遍歷的元素,而對元素所做的處理則通過回調(diào)代碼塊來實現(xiàn);
4.Ruby中的容器對象(如數(shù)組、Range和Hash對象等)都包含了兩個簡單的迭代器,分別是each和collect。each可以認(rèn)為是最簡單的迭代器,它會對集合的每個元素調(diào)用塊。 collect,將容器中的元素傳遞給一個塊,在塊中處理后返回一個包含處理結(jié)果的新數(shù)組;
迭代器詳解
Ruby中的迭代器可以說五花八門,下面我們從字符串、數(shù)字、數(shù)組、Map、文件、目錄等幾個方面來簡單介紹一下Ruby的迭代器。
字符串迭代器
在Java中,字符串類型的數(shù)據(jù)沒有迭代器。所以,如果需要“遍歷”字符串,需要將字符串做一些其他處理才行。但是,在Ruby中就有。下面,我們通過代碼來演示一下:
復(fù)制代碼 代碼如下:
str = "abc"
str.each_byte {|c| printf ">%c", c}; #
# 輸出如下:(為了和代碼區(qū)別,D瓜哥在輸出前面人為地加了#。)
# 以下的輸出展示,處理方式相同。
#>a>b>c
each_byte 是字串中用于處理每個字節(jié)的迭代器。每個字節(jié)都會代入塊參數(shù) c 中。
Ruby中,不僅有用于字節(jié)的迭代器,還有用于每行的迭代器。示例如下:
復(fù)制代碼 代碼如下:
str = "abc\nefg\nhijk"
str.each_line{|l| print l}
# 輸出如下:
#abc
#efg
#hijk
怎么樣,是不是被Ruby簡練但強大的迭代器所折服?!好戲還在后面,接著向下看。
數(shù)字迭代器
在Ruby中,“一切皆為對象”,甚至數(shù)字也是對象。這點和Java不一樣。所以,對字的迭代器,對于我這個Java程序猿也是聞所未聞。讓我們寫兩個示例,管窺一二。
第一個場景:對某段代碼進(jìn)行N(比如5)次操作。在Java中,需要寫個循環(huán),但是在Ruby中,只需要調(diào)用一下times方法即可。代碼如下:
復(fù)制代碼 代碼如下:
5.times {print "I love https://www.jb51.net/ \n"} # 真的就這么簡單
# 輸出如下:
#I love https://www.jb51.net/
#I love https://www.jb51.net/
#I love https://www.jb51.net/
#I love https://www.jb51.net/
#I love https://www.jb51.net/
第二個場景:求1到5的數(shù)字之和。這個也特別簡單:
復(fù)制代碼 代碼如下:
sum = 0
(1..5).each {|i| sum += i}
print "Sum="+sum.to_s
如果使用upto函數(shù),還可以這樣寫:
復(fù)制代碼 代碼如下:
sum = 0
1.upto(5) {|x| sum += x }
print "Sum="+sum.to_s
有時,我們的步進(jìn)不一定是1,可能是2,例如奇數(shù)和。這種情況下,可以使用step函數(shù)。代碼如下:
復(fù)制代碼 代碼如下:
sum = 0
1.step(5, 2) do |y| # step函數(shù)第二個參數(shù)是步進(jìn)。
sum += y
end
print "Sum="+sum.to_s
感覺有點扯遠(yuǎn)了。下面,我們講講數(shù)組相關(guān)的迭代器。
數(shù)組迭代器
見識過了數(shù)字相關(guān)的迭代器,我們再看看數(shù)組相關(guān)的迭代器。
第一個場景:便利數(shù)組并輸出每個元素。直接上代碼:
復(fù)制代碼 代碼如下:
languages = ['Ruby', 'Javascript', 'Java']
languages.each_with_index do |lang, i|
puts "#{i}, I love #{lang}!"
end
#輸出如下:
#0, I love Ruby!
#1, I love Javascript!
#2, I love Java!
有時,我們需要對數(shù)組的元素做出一個挑選,這時可以這樣干:
復(fù)制代碼 代碼如下:
# 找出符合條件的值
b = [1,2,3].find_all{ |x| x % 2 == 1 }
# b的值是 [1,3]
有時,我們需要刪除數(shù)組中的某些值。這時:
復(fù)制代碼 代碼如下:
# 迭代并根據(jù)條件刪除
a = [51, 101, 256]
a.delete_if {|x| x >= 100 }
# a的值是 [51]
再來一個例子:
復(fù)制代碼 代碼如下:
# 找出最長字串find the longest word
longest = ["cat", "sheep", "bear"].inject do |memo,word|
( memo.length > word.length )? memo : word
end
puts longest
#輸出如下:
#sheep
Map迭代器
在Java中,如果相對Map使用迭代器,必須把Map轉(zhuǎn)化成List類型的容器才行。但是,在Ruby中,有直接針對Map的迭代器,很好很方便:
復(fù)制代碼 代碼如下:
sum = 0
outcome = {"book1"=>1000, "book2"=>1000,"book3"=>4000}
outcome.each{|item, price|
sum += price
}
print "Sum="+sum.to_s
甚至,我們還可以這樣:
復(fù)制代碼 代碼如下:
sum = 0
outcome = {"book1"=>1000, "book2"=>1000,"book3"=>4000}
outcome.each{|pair|
sum += pair[1] # 讀取值
}
print "Sum="+sum.to_s
這里說明一下:上述程序使用了pair[1]讀取Map的值,如果要讀取Map的鍵時則寫成pair[0]。
如果需要輸出Map的Key,可以這樣:
復(fù)制代碼 代碼如下:
outcome = {"book1"=>1000, "book2"=>1000,"book3"=>4000}
outcome.each_key do |k|
puts k
end
如果需要輸出Map的value,則可以這樣:
復(fù)制代碼 代碼如下:
outcome = {"book1"=>1000, "book2"=>1000,"book3"=>4000}
outcome.each_value do |v|
puts v
end
文件迭代器
實在是沒有想到,對于文件,Ruby也有迭代器可用。如下:
復(fù)制代碼 代碼如下:
f = File.open("sample.txt")
f.each{|line|
print line
}
f.close
其實,我們可以使用代碼塊來進(jìn)行同樣的操作:
復(fù)制代碼 代碼如下:
File.open("str.rb", "r") do |file|
file.each{|line|
print line
}
end
使用代碼塊,不需要手動close。這個推薦!
目錄迭代器
很多時候,我們需要列出某個目錄下的文件列表,設(shè)置對每個文件進(jìn)行操作,這時也需要迭代器。Ruby也考慮到了:
復(fù)制代碼 代碼如下:
Dir.foreach("c://") do |file| # 請根據(jù)自己的系統(tǒng)類型,做適當(dāng)?shù)男薷?br />
puts file
end
#輸出太多,就不貼結(jié)果了??梢宰约哼\行一下看看
結(jié)尾
通過上面的介紹可以看出,Java和Ruby相比,在迭代器方面簡直是弱爆了!當(dāng)然,D瓜哥剛剛開始學(xué)習(xí)Ruby,文中有不當(dāng)甚至解釋錯誤的地方,勞煩指出,D瓜哥會盡快改正的。
您可能感興趣的文章:- Ruby中Block和迭代器的使用講解
- 舉例講解Ruby中迭代器Iterator的用法
- 簡要說明Ruby中的迭代器
- Ruby迭代器的7種技巧分享
- js 數(shù)組實現(xiàn)一個類似ruby的迭代器
- ruby 迭代器使用方法
- Ruby 迭代器知識匯總