国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

知識講解 Ruby迭代器

開發 開發工具
Ruby迭代器并不是唯一的,在許多應用領域中都存在迭代器。當我們在實際代碼編寫中,會經常遇到使用Ruby迭代器的情況。

首先,我們需要知道什么是Ruby語言。這是一款比較新的解釋型腳本語言。完全面向對象。那么對于Ruby迭代器又有多少人清楚呢?#t#

迭代器并不是Ruby發明的.它廣泛地運用于各種面向對象語言.在Lisp中也有,只是不這么叫罷了.盡管如此,迭代器的概念并不為許多人熟悉,因此我們將在此做較為詳細的介紹。

你知道,動詞 iterate 的意思是做同一件事許多遍,因此,iterator就是用來將同一件事做許多次的東西. 當我們寫代碼時,我們需要各種環境下的循環.在C里,我們用for或者while.比如,

  1. char *str;   
  2. for (str = "abcdefg"
    *str != '\0'; str++) {   
  3. /* process a character here */   
  4. }  

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

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

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

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

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

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

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

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

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

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

  1. ruby> "a\nb\nc\n".each_
    line{|l| print l}   
  2. a   
  3. c   
  4. nil  

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

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

  1. ruby> for l in "a\nb\nc\n"   
  2. | print l   
  3. | end   
  4. a   
  5. c   
  6. nil  

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

  1. ruby> c=0   
  2. 0   
  3. ruby> for i in 0..4   
  4. | print i   
  5. | if i == 2 and c == 0   
  6. c = 1   
  7. | print "\n"   
  8. | retry   
  9. | end   
  10. | end; print "\n"   
  11. 012   
  12. 01234   
  13. nil  

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

  1. ruby> def repeat(num)   
  2. | while num > 0   
  3. | yield   
  4. | num -1   
  5. | end   
  6. | end   
  7. nil   
  8. ruby> repeat(3) { print "foo\n" }   
  9. foo   
  10. foo   
  11. foo   
  12. nil  

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

  1. ruby> def WHILE(cond)   
  2. | return if not cond   
  3. | yield   
  4. | retry   
  5. | end   
  6. nil   
  7. ruby> i=0; WHILE(i<3
    { print i; i+=1 }   
  8. 012 nil  

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

責任編輯:曹凱 來源: jb51.net
相關推薦

2009-12-15 11:01:31

Ruby數組

2009-12-15 15:28:22

Ruby重載

2009-12-16 14:24:48

Ruby函數lambd

2009-12-14 09:33:04

Ruby安裝

2009-12-17 15:11:47

Ruby百分號表示法

2009-12-14 15:30:43

安裝Ruby on R

2010-04-29 18:01:42

Unix服務器

2009-12-16 17:37:31

Ruby on Rai

2009-12-16 15:41:10

Ruby on Rai

2009-12-18 13:49:04

2010-05-17 17:27:31

2009-11-19 15:35:51

路由器基礎知識

2009-12-16 13:21:22

Ruby will_p

2009-12-15 09:56:51

Ruby流程控制

2009-12-18 14:35:01

Ruby奇特變量

2010-05-17 18:10:16

IIS服務器

2010-05-21 15:37:22

IIS服務器

2010-05-12 15:07:44

IIS 服務器

2010-05-18 16:52:42

IIS服務器

2009-03-04 05:59:00

郵件服務器郵件服務器配置
點贊
收藏

51CTO技術棧公眾號

年轻的保姆91精品| 奇米亚洲午夜久久精品| 日韩欧美精品三级| 五月激情在线| 国产精品网站在线| 六月丁香婷婷激情| 久久精品国内一区二区三区 | 欧美白嫩的18sex少妇| 久久久久久一二三区| 免费在线观看视频a| 国产精品自在欧美一区| 一本一道久久久a久久久精品91| 99香蕉国产精品偷在线观看 | 欧美网站免费| 国产一区二区三区久久精品| 激情av在线| 91精品国产aⅴ一区二区| 欧美成人hd| 91麻豆精品国产91久久久久久久久 | 亚洲精品高清视频| 亚洲国产导航| 国产精品乱码一区二区三区| 国产精品成人a在线观看| 国产免费一区二区三区香蕉精| 亚洲电影男人天堂| 秋霞av国产精品一区| 国偷自产av一区二区三区| 欧美国产精品va在线观看| 99久久99九九99九九九| 久久99国产精品久久久久久久久| 成人污污视频| 97久久伊人激情网| 欧美先锋资源| 国产自产在线视频一区| 蜜臀av国产精品久久久久| 8x8ⅹ国产精品一区二区二区| 成人av在线电影| 亚洲午夜激情在线| 3d精品h动漫啪啪一区二区| 国产精品伦理久久久久久| 成人av网站观看| 久久精品国产清高在天天线| avove在线观看| 99精品视频在线播放观看| a√免费观看在线网址www| 精品av在线播放| 羞羞视频在线免费国产| 伊人亚洲福利一区二区三区| 中文在线综合| 成人免费观看a| 首页亚洲欧美制服丝腿| 免费无码毛片一区二三区| 亚洲精品视频在线| 9色在线观看| 亚洲欧美成人精品| 综合中文字幕| 高清视频在线观看一区| 精彩视频一区二区| 国产又大又黄又粗又爽| 在线免费观看视频一区| 日本成人三级电影| 色综合久久88色综合天天看泰| 你懂的视频欧美| 你懂的网址一区二区三区| 9i在线看片成人免费| 国产一级大片| 欧美成人午夜电影| 韩国精品福利一区二区三区| 国产精品区一区二区三含羞草| 岛国一区二区三区| 天堂中文字幕| 亚洲电影在线观看| 成人福利一区| 久久免费一区| 久久久久青草大香线综合精品| 激情小说 在线视频| 原创国产精品91| 欧美一区二区| 六月丁香婷婷激情| 3d成人动漫网站| 欧洲亚洲成人| 黄色免费高清视频| 欧美视频裸体精品| 免费精品一区二区三区在线观看| 风间由美久久久| 久久久另类综合| 日本不卡在线| 日韩av免费看| 激情五月播播久久久精品| 日本福利片免费看| 日韩视频在线免费观看| 在线观看亚洲| av漫画网站| 中文字幕一区二区三区电影| 国内精品久久久久久久97牛牛| 少妇黄色一级片| 精品亚洲国产成av人片传媒| 欧美激情偷拍| 91九色porny视频| 中文字幕一区日韩电影| 欧美中文日韩| 免费观看v片在线观看| 欧美伦理91i| 国产一区三区三区| 欧美私人网站| 国产精品永久免费观看| 国产亚洲一二三区| 亚洲女同av| 国产在线视频欧美一区二区三区| 欧美激情一区二区| 欧美电影在线观看网站| 亚洲欧美日产图| 在线观看不卡视频| 日韩av片子| www.三区| 91禁外国网站| 久久综合99re88久久爱| 男女免费观看在线爽爽爽视频| 成人av资源| 一区二区免费视频| 九九热播视频在线精品6| 日本久久久精品视频| 国产亚洲福利一区| 国产老妇另类xxxxx| 成人观看网址| 一区二区三区在线视频111| 欧美精品aⅴ在线视频| 午夜日韩电影| 国产精品视频二区三区| 92国产精品久久久久首页| 亚洲国产另类av| 欧美日韩国产传媒| 992tv在线观看免费进| 国产精品女人网站| 欧美日韩免费观看中文| 国产精品久久久久久久久妇女| 中文字幕4区| 成人信息集中地欧美| 欧美日韩久久久久| 伊人久久大香线蕉综合热线| 求av网址在线观看| 性欧美videosex高清少妇| 亚洲第一国产精品| 国产精品一品视频| 四虎影视精品永久在线观看| 欧美 日韩 国产 激情| 88国产精品欧美一区二区三区| 国产精品无遮挡| 亚洲精品蜜桃乱晃| 欧美香蕉爽爽人人爽| 国产伦精品一区二区三区视频免费| 欧美亚洲动漫制服丝袜| 日韩精品电影一区亚洲| 人人鲁人人莫人人爱精品| 久久精品免费一区二区| 欧美有码在线视频| 日韩人体视频一二区| 亚洲欧美清纯在线制服| 98色花堂精品视频在线观看| 无码人妻精品一区二区蜜桃网站| 欧美理论片在线观看| 亚洲最大成人综合| 在线亚洲欧美| 外国成人直播| 9l视频白拍9色9l视频| 91久久精品在线| 精品国产区一区| 久久久蜜臀国产一区二区| 99精品视频精品精品视频 | 国产精品久久久久永久免费观看 | 成人羞羞视频免费看看| 超碰97国产在线| 国产丝袜视频一区| 亚洲欧洲成人自拍| 欧美亚韩一区| 九九九伊在线综合永久| 三年片观看免费观看大全视频下载| 国产精品一码二码三码在线| 亚洲美女精品成人在线视频| 亚洲人成精品久久久久久| 亚洲精品国产日韩| 岛国一区二区| 久草视频在线播放| 日韩 欧美 自拍| 国产国产精品人在线视| 欧美一级精品大片| www久久精品| 一区二区电影在线观看| 成人看片网页| 久久国产精品高清一区二区三区| 激情六月天婷婷| 国产精品一区电影| 在线电影欧美日韩一区二区私密| 亚洲电影一区二区| 国产成人av电影在线| 91av精品| 欧美黄视频在线观看| 精品麻豆一区二区三区| 国产国产人免费人成免费视频| 亚洲综合首页|