亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

ruby 迭代器使用方法

2020-10-29 19:47:54
字體:
來源:轉載
供稿:網友
迭代器并不是Ruby發明的.它廣泛地運用于各種面向對象語言.在Lisp中也有,只是不這么叫罷了.盡管如此,迭代器的概念并不為許多人熟悉,因此我們將在此做較為詳細的介紹.

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

當我們寫代碼時,我們需要各種環境下的循環.在C里,我們用for或者while.比如,

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



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

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


當前目錄下所有的C源文件和頭文件都將被處理,由命令行shell來一個個地撿取文件名并處理其中的細節.我想這是在比 C 要高的級別上工作,你覺得呢?

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

因此,所有的OOP語言都包含了一定的迭代器機制.某些語言為此提供一種特殊的類;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 類突然有所改變也應該可以照樣工作.使用迭代器的一個好處便是在此類改變中仍然可以保持健壯;一般的,它的確是好代碼的一個特點.(好,請有點兒耐心,我們將會馬上談到什么是類)

String的另一個迭代器是 each_line.

ruby> "a/nb/nc/n".each_line{|l| print l}
a

c
   nil 


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

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

ruby> for l in "a/nb/nc/n"
    |   print l 
    | end
a

c
   nil 


我們可以用retry流程控制語句連接迭代循環,它會從頭執行當前循環的迭代.

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有時會在一個迭代器的定義中出現. yield將流程控制移至傳遞給迭代器的代碼域(這將會在過程對象那一節介紹更多的細節).下面的例子定義了一個repeat迭代器,會依參數的設置執行多次代碼域.

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相同作用的迭代器,雖然在實際應用中它太慢了.

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


搞懂什么是迭代器了嗎?有一些限制,但你可以寫自己的迭代器;實際上,當你定義一個新的數據類型時,為它定義一個合適的迭代器經常也很方便.這樣看來,上面的例子并不是很好用.在我們理解了類以后,我們可以討論討論更具實際意義的迭代器.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
福利视频导航一区| 国产剧情久久久久久| 欧美风情在线观看| 538国产精品一区二区在线| 77777少妇光屁股久久一区| 这里只有精品视频在线| 97成人精品区在线播放| 亚洲自拍偷拍福利| 亚洲xxx大片| 青青久久av北条麻妃黑人| 成人午夜在线视频一区| 狠狠躁天天躁日日躁欧美| 国内精久久久久久久久久人| 亚洲精品免费av| 国产欧美一区二区三区久久| 国产精品视频男人的天堂| 综合国产在线视频| 色综合伊人色综合网| 亚洲缚视频在线观看| 欧美性xxxxxxxxx| 国产99久久精品一区二区永久免费| 尤物yw午夜国产精品视频| 国产精品扒开腿做爽爽爽男男| 欧美日韩亚洲视频| 欧美成人精品三级在线观看| 国产日韩精品在线观看| 久久精品国产精品亚洲| 亚洲国产精品悠悠久久琪琪| 日韩高清av一区二区三区| 亚洲黄色av女优在线观看| 国产欧美在线视频| 久久精品国产2020观看福利| 亚洲性猛交xxxxwww| 亚洲成人精品av| 中文字幕在线观看亚洲| 中文字幕日韩欧美精品在线观看| 国产精品免费在线免费| 久久精品视频va| 亚洲va久久久噜噜噜久久天堂| 色综合老司机第九色激情| 色综合男人天堂| 最好看的2019的中文字幕视频| 136fldh精品导航福利| 亚洲一区二区三区在线免费观看| 黄色成人在线播放| 色偷偷噜噜噜亚洲男人的天堂| 主播福利视频一区| 亚洲精品一区二区在线| 日本精品在线视频| 日韩黄在线观看| 国模精品视频一区二区| 久久99热精品这里久久精品| 久久久在线免费观看| 国内揄拍国内精品| 午夜精品久久17c| 色综合老司机第九色激情| 国产成人精彩在线视频九色| 另类图片亚洲另类| 日韩在线视频观看| 91免费看片在线| 欧美二区在线播放| 亚洲午夜国产成人av电影男同| 北条麻妃一区二区三区中文字幕| 国产精品午夜视频| 最近更新的2019中文字幕| 欧美日韩第一视频| 成人福利视频网| 亚洲最大av网| 欧美电影在线观看网站| 国产不卡一区二区在线播放| 538国产精品一区二区在线| 国产精品久久久久久搜索| 国产美女高潮久久白浆| 国产成人精品综合久久久| 欧美极品美女视频网站在线观看免费| 亚洲欧美中文在线视频| 欧美猛交ⅹxxx乱大交视频| 色综合久久88色综合天天看泰| 国产精品久久久久77777| 国产成人亚洲综合91| 亚洲国产美女久久久久| 国产精品18久久久久久麻辣| 欧美一级在线播放| 久久天天躁狠狠躁老女人| 国内精品久久久久伊人av| 免费97视频在线精品国自产拍| 国产精品久久激情| 国产精品18久久久久久麻辣| 2020国产精品视频| 91大神在线播放精品| 一本色道久久综合狠狠躁篇怎么玩| 亚洲欧美日韩国产中文专区| 亚洲国产精品推荐| 伊人伊成久久人综合网站| 国产精品黄视频| 久久国产精彩视频| 亚洲精品国精品久久99热一| 色妞在线综合亚洲欧美| 91久久久久久久久| 国产91在线播放精品91| 亚洲视频在线播放| 日韩av资源在线播放| 久久人91精品久久久久久不卡| 久久综合免费视频影院| 色悠久久久久综合先锋影音下载| 欧美激情啊啊啊| 97超视频免费观看| 国产精品一二区| 最新国产成人av网站网址麻豆| 国产在线日韩在线| 成人h片在线播放免费网站| 久久久av一区| 中文字幕一区二区三区电影| 欧洲亚洲女同hd| 久久精品色欧美aⅴ一区二区| 久久精品中文字幕| 91精品国产777在线观看| 97精品国产aⅴ7777| 91精品国产乱码久久久久久蜜臀| 欧美一级bbbbb性bbbb喷潮片| 九九精品在线观看| 欧美三级欧美成人高清www| 成人免费直播live| 国产suv精品一区二区三区88区| 国产一区二区三区在线视频| 18久久久久久| 日韩电影免费观看在线| 国产一区二区三区高清在线观看| 久久成人国产精品| 国内揄拍国内精品少妇国语| 欧美高清无遮挡| 日韩av综合中文字幕| 欧美日韩成人在线视频| 欧美亚洲成人网| 91在线免费视频| 国产一区二区三区在线| 国产日韩欧美在线视频观看| 日韩av一区二区在线观看| 国产精品av电影| 国产精品高清在线观看| 久久久久久91香蕉国产| 国产91色在线播放| 日韩av最新在线| 日韩欧美国产中文字幕| 日本在线观看天堂男亚洲| 欧美香蕉大胸在线视频观看| 91国内免费在线视频| 欧美老少做受xxxx高潮| 18久久久久久| 黄色成人av在线| 国产在线一区二区三区| 欧美xxxx18国产| 欧美国产乱视频| 国产成人亚洲精品| 91精品国产综合久久香蕉| 成人精品视频久久久久| 久久精视频免费在线久久完整在线看| 精品国产老师黑色丝袜高跟鞋| 91亚洲精品在线| 韩国国内大量揄拍精品视频| 亚洲毛片在线看| 亚洲第一精品自拍| 久久亚洲影音av资源网| 国产精品入口免费视频一|