国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄 搜尋
Ruby用戶指南 3、開始 4、簡單的例子 5、字符串 6、正則表達(dá)式 7、數(shù)組 8、回到那些簡單的例子 9、流程控制 10、迭代器 11、面向?qū)ο笏季S 12、方法 13、類 14、繼承 15、重載方法 16、訪問控制 17、單態(tài)方法 18、模塊 19、過程對象 20、變量 21、全局變量 22、實變量 23、局部變量 24、類常量 25、異常處理:rescue 26、異常處理:ensure 27、存取器 28、對象的初始化 29、雜項 RGSS入門教程 1、什么是RGSS 2、開始:最簡單的腳本 3、數(shù)據(jù)類型:數(shù)字 4、數(shù)據(jù)類型:常量與變量 5、數(shù)據(jù)類型:字符串 6、控制語句:條件分歧語句 7、控制語句:循環(huán) 8、函數(shù) 9、對象與類 10、顯示圖片 11、數(shù)組 12、哈希表(關(guān)聯(lián)數(shù)組) 13、類 14、數(shù)據(jù)庫 15、游戲?qū)ο?/a> 16、精靈的管理 17、窗口的管理 18、活動指令 19、場景類 Programming Ruby的翻譯 Programming Ruby: The Pragmatic Programmer's Guide 前言 Roadmap Ruby.new 類,對象和變量 容器Containers,塊Blocks和迭代Iterators 標(biāo)準(zhǔn)類型 深入方法 表達(dá)式Expressions 異常,捕捉和拋出(已經(jīng)開始,by jellen) 模塊 基本輸入輸出 線程和進(jìn)程 當(dāng)遭遇挫折 Ruby和它的世界 Ruby和Web開發(fā) Ruby Tk Ruby 和微軟的 Windows 擴(kuò)展Ruby Ruby語言 (by jellen) 類和對象 (by jellen) Ruby安全 反射Reflection 內(nèi)建類和方法 標(biāo)準(zhǔn)庫 OO設(shè)計 網(wǎng)絡(luò)和Web庫 Windows支持 內(nèi)嵌文檔 交互式Ruby Shell 支持 Ruby參考手冊 Ruby首頁 卷首語 Ruby的啟動 環(huán)境變量 對象 執(zhí)行 結(jié)束時的相關(guān)處理 線程 安全模型 正則表達(dá)式 字句構(gòu)造 程序 變量和常數(shù) 字面值 操作符表達(dá)式 控制結(jié)構(gòu) 方法調(diào)用 類/方法的定義 內(nèi)部函數(shù) 內(nèi)部變量 內(nèi)部常數(shù) 內(nèi)部類/模塊/異常類 附加庫 Ruby變更記錄 ruby 1.6 特性 ruby 1.7 特性 Ruby術(shù)語集 Ruby的運行平臺 pack模板字符串 sprintf格式 Marshal格式 Ruby FAQ Ruby的陷阱
文字

迭代器并不是Ruby發(fā)明的.它廣泛地運用于各種面向?qū)ο笳Z言.在Lisp中也有,只是不這么叫罷了.盡管如此,迭代器的概念并不為許多人熟悉,因此我們將在此做較為詳細(xì)的介紹.

你知道,動詞?iterate?的意思是做同一件事許多遍,因此,iterator就是用來將同一件事做許多次的東西.

當(dāng)我們寫代碼時,我們需要各種環(huán)境下的循環(huán).在C里,我們用for或者while.比如,

char?*str;
for?(str?=?"abcdefg";?*str?!=?'\0';?str++)?{
??/*?process?a?character?here?*/
}

C的for(...)語法提供了一種寫循環(huán)的抽象方法,但測試?*str?是否為空(null)字符需要程序員了解字符串內(nèi)部結(jié)構(gòu)的細(xì)節(jié).這讓C看起來像低級(low-level)語言.更高級的語言是通過它們更具彈性的迭代器支持來實現(xiàn)的.考慮下面的?sh?命令行腳本:

#!/bin/sh
for?i?in?*.[ch];?do??
??????#?...?here?would?be?something?to?do?for?each?file
done

當(dāng)前目錄下所有的C源文件和頭文件都將被處理,由命令行shell來一個個地?fù)烊∥募⑻幚砥渲械募?xì)節(jié).我想這是在比?C?要高的級別上工作,你覺得呢?

但有更多值得我們考慮的:在一種語言能夠很好的給內(nèi)建的數(shù)據(jù)類型的提供迭代器的同時,我們卻仍需要回去用低級別的循環(huán)語言來實現(xiàn)對自己定義的數(shù)據(jù)類型的迭代,這真是讓人失望.在面對對象編程時,用戶經(jīng)常一個接一個地定義數(shù)據(jù)類型,因此這是一個很嚴(yán)重的問題.

因此,所有的OOP語言都包含了一定的迭代器機(jī)制.某些語言為此提供一種特殊的類;Ruby則允許我們直接定義迭代器.

Ruby的String類型有很多有用的迭代器:

ruby>?"abc".each_byte{|c|?printf?"<%c>",?c};?print?"\n"
<a><b><c>
???nil

each_byte?是個用于字符串中每個字符的迭代器.每個字符串由局部變量c代替.這可以翻譯為類似C的代碼...

ruby>?s="abc";i=0
???0
ruby>?while?i<s.length
????|????printf?"<%c>",?s[i];?i+=1
????|?end;?print?"\n"
<a><b><c>
???nil

...然而,?each_byte?迭代器在概念上要簡單些,而且即使以后?String?類突然有所改變也應(yīng)該可以照樣工作.使用迭代器的一個好處便是在此類改變中仍然可以保持健壯;一般的,它的確是好代碼的一個特點.(好,請有點兒耐心,我們將會馬上談到什么是類)

String的另一個迭代器是?each_line.

ruby>?"a\nb\nc\n".each_line{|l|?print?l}
a
b
c
???nil

采用迭代器,這將很輕松的取代C的大多數(shù)編程效果(找換行符,生成子串等等)

前面出現(xiàn)的for語句通過each迭代器實現(xiàn)迭代功能.?String的each和each_line的工作原理差不多,讓我們用for重寫上面的例子:

ruby>?for?l?in?"a\nb\nc\n"
????|???print?l?
????|?end
a
b
c
???nil

我們可以用retry流程控制語句連接迭代循環(huán),它會從頭執(zhí)行當(dāng)前循環(huán)的迭代.

ruby>?c=0
???0
ruby>?for?i?in?0..4
????|???print?i
????|???if?i?==?2?and?c?==?0
????|?????c?=?1
????|?????print?"\n"
????|?????retry
????|???end
????|?end;?print?"\n"
012
01234
???nil

yield有時會在一個迭代器的定義中出現(xiàn).?yield將流程控制移至傳遞給迭代器的代碼域(這將會在過程對象那一節(jié)介紹更多的細(xì)節(jié)).下面的例子定義了一個repeat迭代器,會依參數(shù)的設(shè)置執(zhí)行多次代碼域.

ruby>?def?repeat(num)
????|???while?num?>?0
????|?????yield
????|?????num?-=?1
????|???end
????|?end
???nil
ruby>?repeat(3)?{?print?"foo\n"?}
foo
foo
foo
???nil

利用retry,我們可以定義一個有while相同作用的迭代器,雖然在實際應(yīng)用中它太慢了.

ruby>?def?WHILE(cond)
????|???return?if?not?cond
????|???yield
????|???retry
????|?end
???nil
ruby>?i=0;?WHILE(i<3)?{?print?i;?i+=1?}
012???nil

搞懂什么是迭代器了嗎?有一些限制,但你可以寫自己的迭代器;實際上,當(dāng)你定義一個新的數(shù)據(jù)類型時,為它定義一個合適的迭代器經(jīng)常也很方便.這樣看來,上面的例子并不是很好用.在我們理解了類以后,我們可以討論討論更具實際意義的迭代器. 版權(quán)聲明:RUBY文檔中心的所有文章標(biāo)明[原創(chuàng)]的均為本站作品,版權(quán)屬RUBY中文化計劃,若轉(zhuǎn)載請注明;標(biāo)明[翻譯]的其外文版權(quán)歸原作者,譯文版權(quán)屬RUBY中文化計劃;標(biāo)明[轉(zhuǎn)貼]的,若原作者感到侵犯了他的著作權(quán),那么請及時跟主持人聯(lián)系,我們會盡快更正。 ?
上一篇: 下一篇: