最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Ruby中Block和迭代器的使用講解

 更新時(shí)間:2015年07月13日 11:29:07   投稿:goldensun  
這篇文章主要介紹了Ruby中Block和迭代器的使用,是Ruby入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

我們來(lái)簡(jiǎn)單地描述Ruby的一個(gè)獨(dú)特特性。Block,一種可以和方法調(diào)用相關(guān)聯(lián)的代碼塊,幾乎就像參數(shù)一樣。這是一個(gè)不可思議的功能強(qiáng)大的特性。

可以用Block實(shí)現(xiàn)回調(diào)(但它比Java的匿名內(nèi)部(anonymous inner)類更簡(jiǎn)單),傳遞一組代碼(但它遠(yuǎn)比c的函數(shù)指針靈活),以及實(shí)現(xiàn)迭代器。

Block只是在花括號(hào)或者do...end之間的一組代碼。

{puts "Hello"}             #this is a block

do                      ### 

 club.enroll(person)            #and so is this

 person.socialize              #

end                     ###

為什么有兩種分界符?部分原因是有人覺(jué)得有時(shí)候用一種分界符比另外一種感覺(jué)更自然。另外一部分原因是它們有不同的優(yōu)先級(jí):花括號(hào)比do/end綁定的更緊密些。我們嘗試遵循正在成為Ruby標(biāo)準(zhǔn)的一個(gè)約定俗成,單行block用花括號(hào),多行block用do/end。

一旦創(chuàng)建了block,就可以與方法的調(diào)用相關(guān)聯(lián)。把block的開(kāi)始放在含有方法調(diào)用的源碼行的結(jié)尾處,就可以實(shí)現(xiàn)關(guān)聯(lián)。比如,在下面的代碼中,含有puts "Hi" 的block與greet方法的調(diào)用相關(guān)聯(lián)。

greet {puts "Hi"}

如果方法有參數(shù),它們出現(xiàn)在block之前。

verbose_greet("Dave","loyal customer"){puts "Hi"}

然后使用Ruby的yield語(yǔ)句,方法可以一次或多次地調(diào)用(invoke)相關(guān)聯(lián)的block。可以把yield想象成比如方法調(diào)用,它調(diào)用含有yield語(yǔ)句的方法所關(guān)聯(lián)的block。

下面的例子顯示了如何使用yield語(yǔ)句。定義了一個(gè)方法,它會(huì)調(diào)用yield兩次。然后調(diào)用這個(gè)方法,把block放在同一行,在方法調(diào)用之后(并在方法的所有參數(shù)之后)。

def call_block

 puts "Start of method"

 yield

 yield

 puts "End of method"

end

call_block{puts "In the block"}

輸出結(jié)果:

 Strat of method

 In the block

 In the block

 End of method

可以提供參數(shù)給yield的調(diào)用;參數(shù)會(huì)傳遞到block中。在block中,豎線(|)之間給出參數(shù)名來(lái)接受這些來(lái)自yield的參數(shù)。

 def call_block

  yield("Hello",99)

 end

 call_block {|str,num| ...}

在Ruby庫(kù)中大量使用了block來(lái)實(shí)現(xiàn)迭代器;迭代器是從某種收集(collection)如數(shù)組中連續(xù)返回元素的方法。

animals = %w(ant bee cat dog elk)  #創(chuàng)建一個(gè)數(shù)組

animals.each{|animal| puts animal}  #迭代它的內(nèi)容

輸出結(jié)果:

ant

bee

cat

dog

elk

讓我們看一下如何實(shí)現(xiàn)應(yīng)用在前面例子中的Array類中的each迭代器。each迭代器循環(huán)處理數(shù)組中的元素,對(duì)每個(gè)元素調(diào)用yield。在偽碼中,它可能寫成:

#在Array類中......

def each

 for each element         #<--無(wú)效的Ruby語(yǔ)句

  yield(element)

 end

end

許多內(nèi)建于c和java等語(yǔ)言的循環(huán)結(jié)構(gòu)在Ruby中只是方法調(diào)用,這些方法會(huì)零次或多次地調(diào)用相關(guān)聯(lián)的block。

['cat','dog','horse'].each{|name| print name," "}

5.times {print "*"}

3.upto(6){|i| print i}

('a'..'e').each{|char| print char}

輸出結(jié)果:

cat dog horse *****3456abcde

上面的代碼要求對(duì)象5 五次調(diào)用block;然后要求對(duì)象3調(diào)用一個(gè)block,并傳入一個(gè)連續(xù)的值,直到這個(gè)值到達(dá)6為止。最后對(duì)a到e的字符區(qū)間(range),使用each方法調(diào)用block。

相關(guān)文章

  • 如何利用Ruby簡(jiǎn)單模擬Lambda演算詳解

    如何利用Ruby簡(jiǎn)單模擬Lambda演算詳解

    最近在學(xué)習(xí)lambda演算的相關(guān)內(nèi)容,由于資料不全,學(xué)習(xí)的過(guò)程很是痛苦,下面這篇文章主要給大家介紹了關(guān)于如何利用Ruby簡(jiǎn)單模擬Lambda演算的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)隨著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • ruby中的雙等號(hào)==問(wèn)題詳解

    ruby中的雙等號(hào)==問(wèn)題詳解

    Ruby里面有4種比較方法,equal?, eql?, ==, ===,而且在不同的類里面表現(xiàn)的很不一樣。在使用的時(shí)候也特別容易搞糊涂。 本文先給大家講述一下==號(hào)的用法及使用中應(yīng)該注意的地方
    2016-02-02
  • 使用Ruby編寫腳本進(jìn)行系統(tǒng)管理的教程

    使用Ruby編寫腳本進(jìn)行系統(tǒng)管理的教程

    這篇文章主要介紹了使用Ruby編寫腳本進(jìn)行系統(tǒng)管理的教程,本文來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • 在Ruby程序中連接數(shù)據(jù)庫(kù)的詳細(xì)教程

    在Ruby程序中連接數(shù)據(jù)庫(kù)的詳細(xì)教程

    這篇文章主要介紹了在Ruby程序中連接數(shù)據(jù)庫(kù)的詳細(xì)教程,包括介紹數(shù)據(jù)庫(kù)支持Ruby的接口等,是學(xué)習(xí)Ruby on Rails的基礎(chǔ),需要的朋友可以參考下
    2015-04-04
  • 源代碼快速定位工具-qwandry使用指南

    源代碼快速定位工具-qwandry使用指南

    qwandry是一款能快速定位到我們需要找到庫(kù)文件、項(xiàng)目的工具。是一個(gè)快速打開(kāi)我們指定文件夾的工具,比如快速打開(kāi)rails, activerecord等目錄。
    2014-07-07
  • Ruby3多線程并行Ractor使用方法詳解

    Ruby3多線程并行Ractor使用方法詳解

    這篇文章主要介紹了Ruby3多線程并行Ractor使用方法詳解,Ruby3之前使用Thread來(lái)創(chuàng)建新線,Ruby3通過(guò)Ractor支持真正的多線程并行,多個(gè)Ractor之間可并行獨(dú)立運(yùn)行程,需要的朋友可以參考下
    2022-04-04
  • 編寫Ruby代碼注釋時(shí)需要注意的一些問(wèn)題

    編寫Ruby代碼注釋時(shí)需要注意的一些問(wèn)題

    這篇文章主要介紹了編寫Ruby代碼注釋時(shí)需要注意的一些問(wèn)題,特別是在團(tuán)隊(duì)協(xié)作時(shí)好的注釋能大大增加代碼的可讀性,需要的朋友可以參考下
    2015-08-08
  • Ruby使用REXML庫(kù)來(lái)解析xml格式數(shù)據(jù)的方法

    Ruby使用REXML庫(kù)來(lái)解析xml格式數(shù)據(jù)的方法

    這篇文章主要介紹了Ruby使用REXML庫(kù)來(lái)解析xml格式數(shù)據(jù)的方法,文章最后提及了REXML庫(kù)的使用相關(guān)安全問(wèn)題可以注意一下,需要的朋友可以參考下
    2016-04-04
  • Luhn算法學(xué)習(xí)及其Ruby版實(shí)現(xiàn)代碼示例

    Luhn算法學(xué)習(xí)及其Ruby版實(shí)現(xiàn)代碼示例

    Luhn算法主要北用來(lái)進(jìn)行數(shù)字驗(yàn)證,尤其是卡號(hào)身份證號(hào)等,這里我們就來(lái)看一下Luhn算法學(xué)習(xí)及其Ruby版實(shí)現(xiàn)代碼示例:
    2016-05-05
  • Ruby中的數(shù)組和散列表的使用詳解

    Ruby中的數(shù)組和散列表的使用詳解

    這篇文章主要介紹了Ruby中的數(shù)組和散列表的使用詳解,是Ruby入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-07-07

最新評(píng)論

如东县| 马尔康县| 唐海县| 普兰县| 修水县| 岚皋县| 游戏| 永济市| 怀来县| 宁河县| 桦川县| 永泰县| 华容县| 从化市| 巫山县| 蕉岭县| 长宁区| 乌鲁木齐市| 云霄县| 长兴县| 博野县| 紫云| 墨江| 民权县| 台山市| 康保县| 阿巴嘎旗| 鄂托克前旗| 山西省| 汉源县| 孙吴县| 横峰县| 腾冲县| 江永县| 汉寿县| 周宁县| 延安市| 浏阳市| 晋中市| 岢岚县| 万源市|