国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Ruby - Ruby中的迭代器詳解

Ruby中的迭代器詳解

2020-04-18 11:02腳本之家 Ruby

這篇文章主要介紹了Ruby中的迭代器詳解,本文講解了字符串、數(shù)字、數(shù)組、Map、文件、目錄等情況下使用迭代器的例子,需要的朋友可以參考下

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

  前天看了Ruby的迭代器,對(duì)于我這個(gè)只學(xué)過(guò)Java、C/C++等的人來(lái)說(shuō),絕對(duì)是眼前一亮的感覺(jué)!而且是光彩奪目:沒(méi)想到迭代器還可以這么玩,太簡(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ì)元素所做的處理則通過(guò)回調(diào)代碼塊來(lái)實(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中的迭代器可以說(shuō)五花八門,下面我們從字符串、數(shù)字、數(shù)組、Map、文件、目錄等幾個(gè)方面來(lái)簡(jiǎn)單介紹一下Ruby的迭代器。

字符串迭代器

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

復(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 //www.jfrwli.cn/ \n"} # 真的就這么簡(jiǎn)單

 

# 輸出如下:
#I love //www.jfrwli.cn/
#I love //www.jfrwli.cn/
#I love //www.jfrwli.cn/
#I love //www.jfrwli.cn/
#I love //www.jfrwli.cn/

 

第二個(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

 

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

數(shù)組迭代器

見(jiàn)識(shí)過(guò)了數(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ù)條件刪除
a = [51, 101, 256]
a.delete_if {|x| x >= 100 }
# a的值是 [51]

 

再來(lái)一個(gè)例子:

 

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


# 找出最長(zhǎng)字串find the longest word
longest = ["cat", "sheep", "bear"].inject do |memo,word|
    ( memo.length > word.length )? memo : word
end
puts longest

 

#輸出如下:
#sheep

 

Map迭代器

  在Java中,如果相對(duì)Map使用迭代器,必須把Map轉(zhuǎn)化成List類型的容器才行。但是,在Ruby中,有直接針對(duì)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

 

這里說(shuō)明一下:上述程序使用了pair[1]讀取Map的值,如果要讀取Map的鍵時(shí)則寫成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

 

文件迭代器

  實(shí)在是沒(méi)有想到,對(duì)于文件,Ruby也有迭代器可用。如下:

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

f = File.open("sample.txt")
f.each{|line|
 print line
}
f.close

 

其實(shí),我們可以使用代碼塊來(lái)進(jìn)行同樣的操作:

 

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

File.open("str.rb", "r") do |file|
    file.each{|line|
  print line
 }
end

 

使用代碼塊,不需要手動(dòng)close。這個(gè)推薦!

目錄迭代器

很多時(shí)候,我們需要列出某個(gè)目錄下的文件列表,設(shè)置對(duì)每個(gè)文件進(jìn)行操作,這時(shí)也需要迭代器。Ruby也考慮到了:

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


Dir.foreach("c://") do |file|  # 請(qǐng)根據(jù)自己的系統(tǒng)類型,做適當(dāng)?shù)男薷?br />  puts file
end

 

#輸出太多,就不貼結(jié)果了??梢宰约哼\(yùn)行一下看看

 

結(jié)尾

  通過(guò)上面的介紹可以看出,Java和Ruby相比,在迭代器方面簡(jiǎn)直是弱爆了!當(dāng)然,D瓜哥剛剛開(kāi)始學(xué)習(xí)Ruby,文中有不當(dāng)甚至解釋錯(cuò)誤的地方,勞煩指出,D瓜哥會(huì)盡快改正的。

延伸 · 閱讀

精彩推薦
  • Ruby剖析 Ruby 訪問(wèn)控制

    剖析 Ruby 訪問(wèn)控制

    前面,我們說(shuō) Ruby 沒(méi)有函數(shù),只有方法.而且實(shí)際上有不止一種方法.這一節(jié)我們介紹 訪問(wèn)控制 (accesscontrols). 想想當(dāng)我們?cè)谧罡邔佣皇窃谝粋€(gè)類的定義里定義...

    ruby教程網(wǎng)3572020-04-08
  • RubyRuby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼,數(shù)據(jù)是隨機(jī)的,所以每次的記錄都會(huì)不同。 ...

    ruby教程網(wǎng)2962020-04-10
  • RubyRuby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    Ruby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    這篇文章主要介紹了Ruby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象,本文是學(xué)習(xí)筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • RubyRuby環(huán)境下安裝使用bundler來(lái)管理多版本的gem

    Ruby環(huán)境下安裝使用bundler來(lái)管理多版本的gem

    這篇文章主要介紹了Ruby環(huán)境下安裝使用bundler來(lái)管理多版本的gem的方法,舉了Ruby On Rails中的應(yīng)用實(shí)例來(lái)進(jìn)行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
  • RubyRuby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    這篇文章主要介紹了Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例,建造者模式將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表...

    范孝鵬2192020-05-07
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個(gè)技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • Ruby簡(jiǎn)要說(shuō)明Ruby中的迭代器

    簡(jiǎn)要說(shuō)明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動(dòng)態(tài)語(yǔ)言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
  • RubyCentOS中配置Ruby on Rails環(huán)境

    CentOS中配置Ruby on Rails環(huán)境

    經(jīng)過(guò)一個(gè)上午的折騰,終于把ROR環(huán)境在CentOS中搞定,繞了很多彎路,把文章寫下來(lái)總結(jié)一下 ...

    可樂(lè)加糖4762020-04-12
主站蜘蛛池模板: 一级视频在线播放 | 在线观看av网站永久 | 另类久久| 国产精品久久久亚洲 | 日韩一区不卡 | 免费一级毛片 | 中文字幕在线精品 | 天堂资源库 | av在线免费观看网址 | 精品国产黄a∨片高清在线 成人欧美 | 国产欧美日韩一级大片 | 亚洲免费在线 | 红杏首页 | 青青草一区 | 久久性 | 欧美日韩精品在线 | 久久免费国产精品 | 日韩成人在线观看 | 国产一区二区在线免费观看 | 中文字幕一区二区三区四区不卡 | 久久久午夜爽爽一区二区三区三州 | 毛片网免费 | 99色综合| 日韩免费 | 亚洲精品视频在线看 | 桃乃木香奈在线 | 久久精品国产99 | 午夜精品视频 | 亚洲一区二区在线播放 | 日韩成人在线看 | 一区在线播放 | 卡通动漫第一页 | 午夜影院网站 | 99精品视频在线观看 | 成人二区 | 午夜免费 | 黑人xxx视频 | 丁香五月网久久综合 | 久久精品国产99国产精品 | 日韩一区二区精品视频 | 久久精品一区二区三区四区 |