這章我們將討論更多的Ruby流程控制.
case
我們用case語句測試有次序的條件.正如我們所見的,這和C,Java的switch相當接近,但更強大.
ruby>i=8
ruby>casei
|when1,2..5
|print"1..5 "
|when6..10
|print"6..10 "
|end
6..10
nil
2..5表示2到5之間的一個范圍.下面的表達式測試i是否在范圍內:
(2..5)===i
case內部也是用關系運算符===來同時測試幾個條件.為了保持ruby的面對對象性質,===可以合適地理解為出現在when條件里的對
象.比如,下面的代碼現在第一個when里測試字符串是否相等,并在第二個when里進行正則表達式匹配.
ruby>case'abcdef'
|when'aaa','bbb'
|print"aaaorbbb "
|when/def/
|print"includes/def/ "
|end
includes/def/
nil
while
雖然你將會在下一章發現并不需要經常將循環體寫得很清楚,但Ruby還是提供了一套構建循環的好用的方法.
while是重復的if.我們在猜詞游戲和正則表達式中使用過它(見前面的章節);這里,當條件(condition)為真的時候,它圍繞一個代碼域以
whilecondition...end的形式循環.但while和if可以很容易就運用于單獨語句:
ruby>i=0
0
ruby>print"It'szero. "ifi==0
It'szero.
nil
ruby>print"It'snegative. "ifi<0
nil
ruby>print"#{i+=1} "whilei<3
1
2
3
nil
有時候你想要否定一個測試條件.unless是if的否定,until是一個否定的while.在這里我把它們留給你實驗.
Therearefourwaystointerrupttheprogressofaloopfrominside.First,breakmeans,asinC,toescapefromthe
loopentirely.Second,nextskipstothebeginningofthenextiterationoftheloop(correspondingtoC'scontinue).
Third,rubyhasredo,whichrestartsthecurrentiteration.ThefollowingisCcodeillustratingthemeaningsofbreak,
next,andredo:
有四種從內部中斷循環的方法.第一,和C一樣break從循環中完全退出.第二,next跳到下一次循環迭代的開始(對應于C的continue).第
三,Ruby有redo,它可以重新開始現在的迭代.下面是用C代碼對break,next,redo的意義做了演示:
while(condition){
label_redo:
gotolabel_next;/*ruby's"next"*/
gotolabel_break;/*ruby's"break"*/
gotolabel_redo;/*ruby's"redo"*/
...
...
label_next:
}
label_break:
...
第四種方法是由循環內跳出的方法是returen.return的結果是不僅從循環中跳出,而且會從含循環的方法中跳出.如果有參數,它會返回給方法調用,不然就返回nil.
for
C程序員現在會想知道怎樣做一個"for"循環.Ruby的for比你想象的要有趣一點.下面的loop由集合中的元素控制運行:
foreltincollection
...
end
集合可以是一個數集(也是傳統意義上的for循環):
ruby>fornumin(4..6)
|printnum," "
|end
4
5
6
4..6
也可以是其它的什么類型的集合,比如一個數組:
ruby>foreltin[100,-9.6,"pickle"]
|print"#{elt} (#{elt.type}) "
|end
100(Fixnum)
-9.6(Float)
pickle(String)
[100,-9.6,"pickle"]
但我們說過頭了.for其實是each的另一寫法,正巧,這是我們關于迭代器的第一個例子.下面的兩種形式是等價的:
#Ifyou'reusedtoCorJava,youmightpreferthis.
foriincollection
...
end
#ASmalltalkprogrammermightpreferthis.
collection.each{|i|
...
}
一旦你熟悉了迭代器,它便會常常代替傳統的循環.它們一般更容易處理.因此,讓我們接著學習更多關于迭代器的知識.