麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Ruby > 正文

Ruby中的迭代器詳解

2020-10-29 19:44:07
字體:
供稿:網(wǎng)友

D瓜哥最近想做一個(gè)網(wǎng)站,另外,老早就有學(xué)習(xí)一門動(dòng)態(tài)語(yǔ)言的想法,滿足著兩個(gè)條件的編程語(yǔ)言中,Ruby、Python是最合適的兩種語(yǔ)言。現(xiàn)在Ruby on Rails如日中天,光芒萬(wàn)丈!所以,就選定了Ruby,從零開始學(xué)習(xí)。

  前天看了Ruby的迭代器,對(duì)于我這個(gè)只學(xué)過Java、C/C++等的人來說,絕對(duì)是眼前一亮的感覺!而且是光彩奪目:沒想到迭代器還可以這么玩,太簡(jiǎn)練太方便而且特別強(qiáng)大!然后,D瓜哥就迫不及待的想寫一篇文章給大家介紹介紹Ruby的迭代器!

迭代器簡(jiǎn)介

先簡(jiǎn)單介紹一下迭代器。

1.一個(gè)Ruby迭代器就是一個(gè)簡(jiǎn)單的能接收代碼塊的方法(比如each這個(gè)方法就是一個(gè)迭代器)。特征:如果一個(gè)方法里包含了yield調(diào)用,那這個(gè)方法肯定是迭代器;

2.迭代器方法和塊之間有如下傳遞關(guān)系:塊被當(dāng)成一個(gè)特殊參數(shù)傳給迭代器方法,而迭代器方法內(nèi)部在使用yield調(diào)用代碼塊時(shí)可將參數(shù)值傳入塊;

3.實(shí)際上,迭代器的功能就是一種回調(diào)!迭代器方法所屬的類只負(fù)責(zé)遍歷需要遍歷的元素,而對(duì)元素所做的處理則通過回調(diào)代碼塊來實(shí)現(xiàn);

4.Ruby中的容器對(duì)象(如數(shù)組、Range和Hash對(duì)象等)都包含了兩個(gè)簡(jiǎn)單的迭代器,分別是each和collect。each可以認(rèn)為是最簡(jiǎn)單的迭代器,它會(huì)對(duì)集合的每個(gè)元素調(diào)用塊。 collect,將容器中的元素傳遞給一個(gè)塊,在塊中處理后返回一個(gè)包含處理結(jié)果的新數(shù)組;

迭代器詳解

  Ruby中的迭代器可以說五花八門,下面我們從字符串、數(shù)字、數(shù)組、Map、文件、目錄等幾個(gè)方面來簡(jiǎn)單介紹一下Ruby的迭代器。

字符串迭代器

  在Java中,字符串類型的數(shù)據(jù)沒有迭代器。所以,如果需要“遍歷”字符串,需要將字符串做一些其他處理才行。但是,在Ruby中就有。下面,我們通過代碼來演示一下:

復(fù)制代碼 代碼如下:

str = "abc"
str.each_byte {|c| printf ">%c", c};  #

# 輸出如下:(為了和代碼區(qū)別,D瓜哥在輸出前面人為地加了#。)
# 以下的輸出展示,處理方式相同。
#>a>b>c

each_byte 是字串中用于處理每個(gè)字節(jié)的迭代器。每個(gè)字節(jié)都會(huì)代入塊參數(shù) c 中。

Ruby中,不僅有用于字節(jié)的迭代器,還有用于每行的迭代器。示例如下:

復(fù)制代碼 代碼如下:

str = "abc/nefg/nhijk"
str.each_line{|l| print l}

# 輸出如下:
#abc
#efg
#hijk

怎么樣,是不是被Ruby簡(jiǎn)練但強(qiáng)大的迭代器所折服?!好戲還在后面,接著向下看。

數(shù)字迭代器

  在Ruby中,“一切皆為對(duì)象”,甚至數(shù)字也是對(duì)象。這點(diǎn)和Java不一樣。所以,對(duì)字的迭代器,對(duì)于我這個(gè)Java程序猿也是聞所未聞。讓我們寫兩個(gè)示例,管窺一二。

  第一個(gè)場(chǎng)景:對(duì)某段代碼進(jìn)行N(比如5)次操作。在Java中,需要寫個(gè)循環(huán),但是在Ruby中,只需要調(diào)用一下times方法即可。代碼如下:

復(fù)制代碼 代碼如下:

5.times {print "I love http://www.companysz.com/ /n"} # 真的就這么簡(jiǎn)單

# 輸出如下:
#I love http://www.companysz.com/
#I love http://www.companysz.com/
#I love http://www.companysz.com/
#I love http://www.companysz.com/
#I love http://www.companysz.com/

第二個(gè)場(chǎng)景:求1到5的數(shù)字之和。這個(gè)也特別簡(jiǎn)單:

復(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

 有時(shí),我們的步進(jìn)不一定是1,可能是2,例如奇數(shù)和。這種情況下,可以使用step函數(shù)。代碼如下:

復(fù)制代碼 代碼如下:

sum = 0  
1.step(5, 2) do |y| # step函數(shù)第二個(gè)參數(shù)是步進(jìn)。
   sum += y  
end 
print "Sum="+sum.to_s

感覺有點(diǎn)扯遠(yuǎn)了。下面,我們講講數(shù)組相關(guān)的迭代器。

數(shù)組迭代器

見識(shí)過了數(shù)字相關(guān)的迭代器,我們?cè)倏纯磾?shù)組相關(guān)的迭代器。

第一個(gè)場(chǎng)景:便利數(shù)組并輸出每個(gè)元素。直接上代碼:

復(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í),我們需要對(duì)數(shù)組的元素做出一個(gè)挑選,這時(shí)可以這樣干:

復(fù)制代碼 代碼如下:

# 找出符合條件的值
b = [1,2,3].find_all{ |x| x % 2 == 1 }
# b的值是 [1,3]

 有時(shí),我們需要?jiǎng)h除數(shù)組中的某些值。這時(shí):

復(fù)制代碼 代碼如下:

# 迭代并根據(jù)條件 主站蜘蛛池模板: 国产资源在线免费观看 | 久久精品一区二区三区国产主播 | 91在线播放国产 | 国产精品久久久久久影院8一贰佰 | 久久看免费视频 | 国产精品999在线 | 色视频在线 | 黄污网站在线观看 | 日韩黄色一级视频 | 黄色毛片一级视频 | 精品国产一区二区三区四区阿崩 | 日韩a毛片免费观看 | 伊人亚洲精品 | 免费a级片在线观看 | 成人三级电影网站 | 成人毛片网站 | 久久久三级免费电影 | 午夜视频在线观看免费视频 | 免费国产羞羞网站视频 | 88xx成人永久免费观看 | 一级毛片免费大片 | 青热久思思 | 亚洲午夜在线 | 欧美激情综合在线 | 免费视频aaa | 精品成人免费视频 | 欧洲成人一区 | 久久精品中文字幕 | 免费看污视频在线观看 | 毛片毛片免费看 | 欧美不卡视频在线观看 | 中文字幕在线观看国产 | 露脸各种姿势啪啪的清纯美女 | av在线播放亚洲 | 国产91精品欧美 | 国产毛片在线高清视频 | 日韩激情一区 | 狠狠久久伊人中文字幕 | 黄网站免费观看视频 | 国产福利视频在线观看 | 国产精品视频一区二区三区四区国 |