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

首頁 > 編程 > Ruby > 正文

ruby 迭代器使用方法

2020-03-29 12:12:18
字體:
來源:轉載
供稿:網友
迭代器并不是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
久久香蕉国产线看观看网| 久久这里有精品| 日韩免费在线看| 欧美日韩国产va另类| 久久伊人精品视频| 日本精品视频在线播放| 国内偷自视频区视频综合| 色偷偷88888欧美精品久久久| 中文字幕久久精品| 国内免费久久久久久久久久久| 在线亚洲欧美视频| 亚洲欧美日韩中文视频| 亚洲欧美日韩中文在线| 一区二区三区在线播放欧美| 日韩在线播放一区| 国产精品视频1区| 日本高清+成人网在线观看| 精品国产乱码久久久久久天美| 色综合久久悠悠| 这里只有精品在线播放| 人妖精品videosex性欧美| 国产成人一区二区三区小说| 亚洲wwwav| 亚州av一区二区| 国产成人综合久久| 亚洲国产精品视频在线观看| 亚洲高清在线观看| 国产免费一区视频观看免费| 69av视频在线播放| 久久香蕉频线观| 国产成+人+综合+亚洲欧美丁香花| 欧美久久精品一级黑人c片| 91中文精品字幕在线视频| 欧美日韩国产精品一区二区三区四区| 亚洲无线码在线一区观看| 日韩美女写真福利在线观看| 日日骚久久av| 国产成人91久久精品| 国产a∨精品一区二区三区不卡| 亚洲国产天堂久久综合| 国产精品美女在线| 亚洲国产精品久久久| 久久精品一偷一偷国产| 97精品国产97久久久久久春色| 久久久中文字幕| 国模精品一区二区三区色天香| 91精品久久久久久久久久久| 国产成人亚洲综合91| 日韩成人中文字幕在线观看| 久久久久久久久久久国产| 国产精品jizz在线观看麻豆| 欧美激情亚洲国产| 日韩亚洲成人av在线| 亚洲美腿欧美激情另类| 97色伦亚洲国产| 少妇精69xxtheporn| 亚洲无线码在线一区观看| 国外成人在线视频| 久久精品视频中文字幕| 欧美色视频日本版| 亚洲性视频网址| 亚洲欧美999| 久久亚洲国产成人| 欧美激情一区二区三级高清视频| 久久久久久97| 九九久久精品一区| 亚洲品质视频自拍网| 这里只有精品久久| 欧美二区在线播放| 国产原创欧美精品| 欧洲成人在线观看| 91精品国产91久久久久久最新| 欧美成人激情视频免费观看| 日韩电影免费在线观看中文字幕| 亚洲毛片在线观看.| 国产久一一精品| 黑人巨大精品欧美一区二区免费| 精品亚洲一区二区三区在线观看| 欧美激情喷水视频| 欧美激情一区二区三区高清视频| 亚洲人成网站色ww在线| 69影院欧美专区视频| 国产精品草莓在线免费观看| 国产精品久久久久久久9999| 精品二区三区线观看| 久久久久北条麻妃免费看| www.日韩系列| 欧美一区二区三区精品电影| 亚州国产精品久久久| 亚洲www视频| 亚洲一区av在线播放| 欧美日韩福利电影| 午夜精品久久久久久久男人的天堂| 日韩视频在线一区| 国产91精品在线播放| 中文字幕在线精品| 国产精品成人一区二区| 久久久免费观看| 国产日韩精品视频| 亚洲欧美一区二区三区情侣bbw| 国产精品久久久久久中文字| 国产成人精品视频在线| 伊人久久大香线蕉av一区二区| 日韩欧美中文第一页| 精品成人av一区| 欧美成aaa人片免费看| 亚洲精品一二区| 欧美做受高潮1| 91亚洲精华国产精华| 亚洲视频免费一区| 国产精品成人一区二区三区吃奶| 亚洲黄色有码视频| 97视频在线免费观看| 伊人久久综合97精品| 97avcom| 激情久久av一区av二区av三区| 欧美黄色三级网站| 国产精品第2页| 亚洲欧洲国产精品| 国产精品第3页| 一本一道久久a久久精品逆3p| 精品久久久av| 欧美肥老太性生活视频| 亚洲欧美日韩精品久久奇米色影视| 亚洲成人av在线| 欧美在线xxx| 亚洲最大激情中文字幕| 国产精品极品尤物在线观看| 一本色道久久88精品综合| 国产99久久精品一区二区| 久久精品99国产精品酒店日本| 欧美在线视频导航| 亲爱的老师9免费观看全集电视剧| 中文字幕综合在线| 国产精品激情av在线播放| 久久精品亚洲国产| 国内精品美女av在线播放| 欧美成人性色生活仑片| 91精品视频播放| 国产精品精品一区二区三区午夜版| 在线播放精品一区二区三区| 在线播放国产一区二区三区| 中文字幕亚洲自拍| 亚洲一区二区三区乱码aⅴ| 国产91精品在线播放| 九九久久精品一区| 亚洲欧美在线x视频| 国产精品一区二区av影院萌芽| 国产91ⅴ在线精品免费观看| 亚洲自拍偷拍在线| 日韩欧美中文字幕在线观看| 91免费精品国偷自产在线| 欧美激情综合色综合啪啪五月| 欧美不卡视频一区发布| 亚洲在线视频观看| 国产91色在线|免| 欧美人在线视频| 亚洲国内精品视频| 亚洲一区二区久久久| 欧美国产精品va在线观看| 国产一区二中文字幕在线看| 国产精品久久久久久久久影视| 亚洲欧美www| 亚洲成av人片在线观看香蕉|