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

首頁 > 編程 > Ruby > 正文

ruby 迭代器使用方法

2020-02-24 15:41:35
字體:
來源:轉載
供稿:網友

迭代器并不是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}; print "/n"

   nil 


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

ruby> s="abc";i=0
   0
ruby> while i    |    printf "", s[i]; i+=1
    | end; print "/n"


   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(i012   nil 


搞懂什么是迭代器了嗎?有一些限制,但你可以寫自己的迭代器;實際上,當你定義一個新的數據類型時,為它定義一個合適的迭代器經常也很方便.這樣看來,上面的例子并不是很好用.在我們理解了類以后,我們可以討論討論更具實際意義的迭代器.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www.亚洲一区| 国产一区二区三区四区福利| 国产精品久久久久久亚洲影视| 国产在线视频一区| 91亚洲va在线va天堂va国| 亚洲欧美中文在线视频| 91中文在线观看| 97在线免费观看视频| 另类专区欧美制服同性| 亚洲97在线观看| 欧美视频二区36p| 日日摸夜夜添一区| 欧美成人激情图片网| 久久国产精品电影| 91国内产香蕉| 在线播放日韩av| 亚洲qvod图片区电影| 色婷婷综合成人| 久久久久久中文| 久久久久国产精品免费网站| 亚洲欧美精品一区二区| 久久中文字幕国产| 不卡av电影在线观看| 亚洲精品av在线播放| 色青青草原桃花久久综合| 成人在线视频网| 亚洲第一精品久久忘忧草社区| 亚洲成人精品视频在线观看| 日韩中文字幕久久| 91久久精品国产| 浅井舞香一区二区| 青青草原一区二区| 日韩精品中文字幕视频在线| 国产精品亚洲аv天堂网| 亚洲精品视频在线观看视频| 日韩av综合网站| 91av免费观看91av精品在线| 国产欧美日韩高清| 中文字幕视频在线免费欧美日韩综合在线看| 日产精品99久久久久久| 66m—66摸成人免费视频| 亚洲性xxxx| 欧美整片在线观看| 国产精品久久久久久亚洲影视| 久久久久久69| 日本欧美中文字幕| 欧美最猛性xxxx| 国产精品久久久久aaaa九色| 精品国产精品三级精品av网址| 久久激情五月丁香伊人| 中文字幕日韩综合av| 国产成人在线播放| 中文字幕亚洲二区| 97超级碰在线看视频免费在线看| 亚洲va码欧洲m码| 久久综合伊人77777尤物| 久久久久久av| 欧美精品www| 91最新国产视频| 欧美特黄级在线| 狠狠干狠狠久久| 国产激情综合五月久久| 成人网页在线免费观看| 久久久极品av| 成人黄色激情网| 中文字幕在线看视频国产欧美在线看完整| 5252色成人免费视频| 久久影视三级福利片| 欧美精品久久久久久久久| 成人午夜一级二级三级| 日韩av色综合| 亚洲激情小视频| 欧美精品久久久久久久久| 影音先锋日韩有码| 欧美电影免费观看电视剧大全| 日韩有码视频在线| 亚洲**2019国产| 久久久久久久久久久网站| 国产日韩在线一区| 国产精品久久久av| 在线观看国产精品91| 国产精品揄拍500视频| 亚洲精品国产美女| 国产精品国产自产拍高清av水多| 亚洲一区二区免费在线| 色综合男人天堂| 欧美精品电影在线| 精品久久久久久久大神国产| 亚洲一区二区精品| 国产香蕉97碰碰久久人人| 国产精品自产拍在线观看| 色妞欧美日韩在线| 亚洲成色777777在线观看影院| 色噜噜久久综合伊人一本| 亚洲国产精品久久久久秋霞蜜臀| 日韩免费观看在线观看| 亚洲最大的成人网| 久久噜噜噜精品国产亚洲综合| 欧美孕妇性xx| 91精品久久久久久久久久久| 亚洲视频axxx| 国产精品久久久久久久9999| 成人免费网站在线看| 亚洲一区av在线播放| 午夜精品久久久久久99热| 亚洲国产另类久久精品| 日韩大片免费观看视频播放| 日韩激情视频在线播放| 揄拍成人国产精品视频| 欧美成人免费全部观看天天性色| 欧美影院久久久| 日韩欧美极品在线观看| 国产精品国产福利国产秒拍| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久久精品视频成人| 日av在线播放中文不卡| 欧美性猛交xxxx黑人猛交| 国产盗摄xxxx视频xxx69| 精品国产视频在线| 精品女同一区二区三区在线播放| 亚洲第一页自拍| 亚洲v日韩v综合v精品v| 亚洲性av在线| 91av在线影院| 国产美女精品视频免费观看| 国产精品一区二区三区毛片淫片| 日韩h在线观看| 日韩一中文字幕| 精品中文字幕久久久久久| 欧美性猛交xxxx富婆弯腰| 成人黄色大片在线免费观看| 成人亚洲综合色就1024| 亚洲一区亚洲二区| 亚洲变态欧美另类捆绑| 国产剧情日韩欧美| 成年无码av片在线| 久久精品视频中文字幕| 5566日本婷婷色中文字幕97| 三级精品视频久久久久| 久久精品国产久精国产一老狼| 最新的欧美黄色| 影音先锋欧美在线资源| 亚洲欧美在线一区| 亚洲一区二区三区乱码aⅴ| 欧美裸体xxxxx| 国产精品久久国产精品99gif| 亚洲色图激情小说| 一区二区在线视频| 成人美女av在线直播| 成人黄色生活片| 成人伊人精品色xxxx视频| 2019日本中文字幕| 亚洲a级在线播放观看| 韩日精品中文字幕| 色综合天天狠天天透天天伊人| 国产精品高清免费在线观看| 8x海外华人永久免费日韩内陆视频| 欧美影院久久久| 日韩精品视频免费专区在线播放| 国产欧美日韩丝袜精品一区| 欧美一级成年大片在线观看| 国产精品免费电影| 国产日韩欧美中文在线播放| 亚洲伊人成综合成人网|