最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ruby 迭代器使用方法

 更新時(shí)間:2007年11月24日 13:10:04   作者:  
迭代器并不是Ruby發(fā)明的.它廣泛地運(yùn)用于各種面向?qū)ο笳Z言.在Lisp中也有,只是不這么叫罷了.盡管如此,迭代器的概念并不為許多人熟悉,因此我們將在此做較為詳細(xì)的介紹.

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

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

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



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

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


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

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

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

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

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


each_byte 是個(gè)用于字符串中每個(gè)字符的迭代器.每個(gè)字符串由局部變量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 迭代器在概念上要簡(jiǎn)單些,而且即使以后 String 類突然有所改變也應(yīng)該可以照樣工作.使用迭代器的一個(gè)好處便是在此類改變中仍然可以保持健壯;一般的,它的確是好代碼的一個(gè)特點(diǎn).(好,請(qǐng)有點(diǎn)兒耐心,我們將會(huì)馬上談到什么是類)

String的另一個(gè)迭代器是 each_line.

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

c
   nil 


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

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

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

c
   nil 


我們可以用retry流程控制語句連接迭代循環(huán),它會(huì)從頭執(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有時(shí)會(huì)在一個(gè)迭代器的定義中出現(xiàn). yield將流程控制移至傳遞給迭代器的代碼域(這將會(huì)在過程對(duì)象那一節(jié)介紹更多的細(xì)節(jié)).下面的例子定義了一個(gè)repeat迭代器,會(huì)依參數(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,我們可以定義一個(gè)有while相同作用的迭代器,雖然在實(shí)際應(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 


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

相關(guān)文章

  • 在Docker中自動(dòng)化部署Ruby on Rails的教程

    在Docker中自動(dòng)化部署Ruby on Rails的教程

    這篇文章主要介紹了在Docker中部署Ruby on Rails的教程,Docker是當(dāng)下最火的虛擬機(jī),而本文所介紹的Ruby on Rails的部署則充分利用了Ruby中的rake這一炫酷的實(shí)現(xiàn)自動(dòng)化的方法,需要的朋友可以參考下
    2015-06-06
  • Ruby on Rails基礎(chǔ)之新建項(xiàng)目

    Ruby on Rails基礎(chǔ)之新建項(xiàng)目

    Ruby on Rails 是一個(gè)可以使你開發(fā),部署,維護(hù) web 應(yīng)用程序變得簡(jiǎn)單的框架。下面我們就來看看如何簡(jiǎn)單便捷的使用這一框架,本系列文章將一一為大家揭秘
    2016-02-02
  • ruby 學(xué)習(xí)筆記(1) 初識(shí)語法

    ruby 學(xué)習(xí)筆記(1) 初識(shí)語法

    Ruby是一種簡(jiǎn)單的面向?qū)ο缶幊陶Z言,十分容易上手,并且功能強(qiáng)大,ruby/ruby on rails從2007年就一直獲獎(jiǎng)無數(shù),下面這篇文章給大家詳細(xì)介紹下,需要的朋友可以參考下
    2010-02-02
  • Ruby和元編程之萬物皆為對(duì)象

    Ruby和元編程之萬物皆為對(duì)象

    這篇文章主要介紹了Ruby和元編程之萬物皆為對(duì)象,想要掌握Ruby和Ruby的元編程,對(duì)象就是第一門必修功課,需要的朋友可以參考下
    2014-10-10
  • 詳解Ruby中的異常

    詳解Ruby中的異常

    這篇文章主要介紹了詳解Ruby中的異常,異常的拋出和處理是各種編程語言學(xué)習(xí)中基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-04-04
  • ruby實(shí)現(xiàn)的一個(gè)異步文件下載HttpServer實(shí)例

    ruby實(shí)現(xiàn)的一個(gè)異步文件下載HttpServer實(shí)例

    這篇文章主要介紹了ruby實(shí)現(xiàn)的一個(gè)異步文件下載HttpServer,使用eventmachine和em-http-server實(shí)現(xiàn),需要的朋友可以參考下
    2014-07-07
  • Ruby中操作字符串的一些基本方法

    Ruby中操作字符串的一些基本方法

    這篇文章主要介紹了Ruby中操作字符串的一些基本方法,包括對(duì)字符串的壓縮和解壓縮等處理,需要的朋友可以參考下
    2015-05-05
  • 使用Ruby on Rails和PostgreSQL自動(dòng)生成UUID的教程

    使用Ruby on Rails和PostgreSQL自動(dòng)生成UUID的教程

    這篇文章主要介紹了使用Ruby on Rails和PostgreSQL自動(dòng)生成UUID的教程,主要利用到了PostgreSQL的插件uuid-ossp,需要的朋友可以參考下
    2015-04-04
  • Ruby中關(guān)于hash的基本使用方法

    Ruby中關(guān)于hash的基本使用方法

    這篇文章主要介紹了Ruby中關(guān)于hash的基本使用方法,包括哈希的創(chuàng)建和一些內(nèi)置方法的使用,需要的朋友可以參考下
    2015-05-05
  • 寫一個(gè)漂亮Rakefile的方法

    寫一個(gè)漂亮Rakefile的方法

    這篇文章主要介紹了寫一個(gè)漂亮Rakefile的方法,文中主要就是寫一個(gè)類,繼承自 Tasklib,然后在這個(gè)類的初始化函數(shù)里用 task 或者 file 來定義實(shí)際完成任務(wù)的子 task 即可,需要的朋友可以參考下
    2014-06-06

最新評(píng)論

金山区| 山阴县| 苍山县| 蒙阴县| 道真| 衡阳市| 天柱县| 雅安市| 蒲城县| 阿图什市| 潍坊市| 思茅市| 江华| 遵义县| 青川县| 南靖县| 宁海县| 额济纳旗| 巴马| 茶陵县| 桃园市| 剑川县| 伽师县| 南宁市| 仪陇县| 伊宁县| 阜宁县| 乐清市| 遂溪县| 交口县| 松阳县| 蓬溪县| 重庆市| 青龙| 南投县| 海淀区| 和龙市| 崇礼县| 绍兴市| 张家界市| 密云县|