国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

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

2019-10-26 19:27:44
字體:
供稿:網(wǎng)友

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

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

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

{puts "Hello"}             #this is a blockdo                      ###  club.enroll(person)            #and so is this person.socialize              #end                     ###

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

一旦創(chuàng)建了block,就可以與方法的調(diào)用相關(guān)聯(lián)。把block的開始放在含有方法調(diào)用的源碼行的結(jié)尾處,就可以實現(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語句,方法可以一次或多次地調(diào)用(invoke)相關(guān)聯(lián)的block。可以把yield想象成比如方法調(diào)用,它調(diào)用含有yield語句的方法所關(guān)聯(lián)的block。

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

def call_block puts "Start of method" yield yield puts "End of method"endcall_block{puts "In the block"}

輸出結(jié)果:

 Strat of method In the block In the block End of method

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

 def call_block  yield("Hello",99) end call_block {|str,num| ...}

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

animals = %w(ant bee cat dog elk)  #創(chuàng)建一個數(shù)組animals.each{|animal| puts animal}  #迭代它的內(nèi)容

輸出結(jié)果:

antbeecatdogelk

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

#在Array類中......def each for each element         #<--無效的Ruby語句  yield(element) endend            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 教育| 昂仁县| 承德市| 崇州市| 嘉义市| 凤山县| 凤台县| 霍州市| 鹤峰县| 库尔勒市| 霍城县| 汉川市| 华阴市| 娱乐| 汉沽区| 大同县| 诸暨市| 土默特左旗| 南投县| 枣强县| 福泉市| 铜陵市| 仁怀市| 黎城县| 湾仔区| 封丘县| 客服| 仙游县| 彭山县| 五台县| 五大连池市| 泸水县| 固原市| 杭锦后旗| 哈尔滨市| 富锦市| 汕头市| 离岛区| 阳原县| 郎溪县| 武穴市|