十年修得柯景騰,百年修得王小賤,千年修得李大仁,萬年修得湫哥哥随夸。
嗯…苹享,流程控制(Flow Control)是前面提到的內(nèi)容的綜合,盡管本章會(huì)比介紹方法的天外有天那一章要簡(jiǎn)短和容易些标捺,但是它將打開涉及到編程潛能的整個(gè)世界(打通任督二脈 嘿嘿哈嘿)伶跷。學(xué)完這一章后我們就能夠?qū)懗稣嬲薪换サ某绦颍辉谥拔覀円呀?jīng)可以讓程序輸出不同的內(nèi)容松逊,但是要通過鍵盤輸入的方式,但在本章之后程序可以真正在屏幕上顯示出不同的內(nèi)容肯夏。在我們能做到這之前经宏,我們需要能夠在程序中對(duì)不同的對(duì)象進(jìn)行比較,我們就需要用到……
對(duì)比方法
我們可以快速瀏覽一下這部門內(nèi)容驯击,方便我們下一小節(jié)分支Branching
的學(xué)習(xí)烁兰,許多酷的內(nèi)容都在里面。要比較一個(gè)對(duì)象比另一個(gè)要大于或小于徊都,我們用 > 和 <:
puts 1 > 2
puts 1 < 2
輸出結(jié)果正常沪斟,同樣地我們比較一個(gè)對(duì)象比另一個(gè)大于等于或小于等于會(huì)用 >= 和 <= :
puts 5 >= 5
puts 5 <= 4
最后我們比較兩個(gè)對(duì)象是否相同用 ==(表示“它們相等嗎?”)和 !=(表示“它們不等嗎暇矫?”)主之。能否區(qū)分 = 和 ==是很重要的,= 是告訴某個(gè)變量去指向某對(duì)象(是賦值過程)李根,而 ==是在解答問題:“這兩個(gè)對(duì)象是相等的嗎槽奕?”
puts 1 == 1
puts 2 != 1
當(dāng)然我們也可以進(jìn)行字符串之間的比較。在進(jìn)行字符串比較時(shí)房轿,實(shí)際是比較字母的順序粤攒,也就是字典中字符串先后的順序。cat在字典中比dog靠前囱持,因此:
puts 'cat' < 'dog'
這里需要有個(gè)了解:電腦處理對(duì)象的方式是它們會(huì)把大寫字符放在小寫字符前面(這就是它們處理字體的方法夯接,比如所有大寫的字符優(yōu)先前置,然后才是小寫字符)纷妆,這就意味著電腦會(huì)認(rèn)為“Zoo”要在"ant"前面盔几,因此如果你想知道在真正的字典里哪個(gè)單詞在前面,請(qǐng)確保在比較前兩個(gè)單詞都要用小寫(或大寫)凭需。
在學(xué)習(xí)Branching
前還有一點(diǎn)要提的是:對(duì)比方法為我們輸出的不是字符串 "true" 和 "false",它輸出的是特殊的對(duì)象true
和false
.(當(dāng)然用true.to_s
會(huì)輸出字符串“true”)true
和false
會(huì)頻繁運(yùn)用在下面將要介紹的分支用法中……
分支Branching
分支是一個(gè)簡(jiǎn)單的定義问欠,但是相當(dāng)有用肝匆。它簡(jiǎn)單到我都沒必要解釋它,只需用下面的例子演示一下:
puts 'Hello, what\'s your name?'
name = gets.chomp
puts 'Hello, ' + name + '.'
if name == 'Chris'
puts 'What a lovely name!'
end
但是如果我們輸入不一樣的名字:
上面就是分支程序:如果在if后面的判斷是ture的時(shí)候顺献,程序?qū)?huì)運(yùn)行if與end之間的代碼旗国;而如果if后面是false時(shí)就不會(huì)運(yùn)行之間的代碼,分支程序就是這么簡(jiǎn)單平直注整。
我將if與end之間的代碼縮進(jìn)僅是考慮這種方式能夠更明顯與分支程序保持關(guān)聯(lián)能曾,幾乎所有的程序員不論使用哪種計(jì)算機(jī)語言都會(huì)像這樣將代碼縮進(jìn)。在簡(jiǎn)單的程序中可能會(huì)看不出縮進(jìn)有多大用處肿轨,但當(dāng)程序變得更加復(fù)雜時(shí)縮進(jìn)就會(huì)起到很大的便利了寿冕。
通常我們喜歡一個(gè)程序在條件為真時(shí)做A事情,當(dāng)條件為假時(shí)做B事情椒袍,這時(shí)正好需要用到else:
puts 'I am a fortune-teller. Tell me your name:'
name = gets.chomp
if name == 'Chris'
puts 'I see great things in your future.'
else
puts 'Your future is... Oh my! Look at the time!'
puts 'I really have to go, sorry!'
end
現(xiàn)在讓我們?cè)囈粋€(gè)不同的名字:
分支程序就像代碼中的分叉一樣:對(duì)于名字是“Chris”的人走的是一條路徑驼唱,對(duì)于名字不是“Chris”的人走另外的路徑。
正如一棵樹的分叉一樣驹暑,我們可以在已經(jīng)有分支的程序中再嵌入分支:
puts 'Hello, and welcome to 7th grade English.'
puts 'My name is Mrs. Gabbard. And your name is...?'
name = gets.chomp
if name == name.capitalize
puts 'Please take a seat, ' + name + '.'
else
puts name + '? You mean ' + name.capitalize + ', right?'
puts 'Don\'t you even know how to spell your name??'
reply = gets.chomp
if reply.downcase == 'yes'
puts 'Hmmph! Well, sit down!'
else
puts 'GET OUT!!'
end
end
運(yùn)行成功玫恳,現(xiàn)在我把名字大寫:
有時(shí)可能會(huì)分不清代碼中許多的if、else和end是用在哪個(gè)分支中优俘,我個(gè)人的解決方法是在寫if的同時(shí)就寫上end京办,所以如果讓我寫上面的程序,我會(huì)寫成如下的樣式:
然后我在中間填充注釋帆焕,電腦會(huì)自動(dòng)忽略這些注釋:
在#號(hào)后的所有內(nèi)容都會(huì)被認(rèn)為是注釋惭婿,然后我會(huì)用代碼替換掉注釋。一些程序員會(huì)在程序中保留注釋叶雹,我個(gè)人認(rèn)為好的代碼通常自身就能夠很好的解釋它自己(自解釋)财饥,我以前會(huì)在程序中經(jīng)常使用注釋,但在接觸Ruby后隨著我對(duì)Ruby的不斷熟悉浑娜,我開始變得很少用注釋佑力,并發(fā)現(xiàn)寫注釋會(huì)消耗掉許多時(shí)間。當(dāng)然這只是個(gè)人的偏好筋遭,你會(huì)有屬于自己的編程習(xí)慣打颤。接下來我寫程序的下一步是:
再一次,我會(huì)同時(shí)寫下if漓滔,else和end编饺。這樣能夠在寫代碼時(shí)幫助我理順“我寫的具體是哪個(gè)分支”,使我集中精力在一小部分中响驴,在if與else之間填充代碼透且,使得寫程序變得更加容易;同時(shí)這樣寫的另一個(gè)好處是使電腦能夠在任何時(shí)候識(shí)別出來程序編寫的進(jìn)度,我顯示給你的任何一個(gè)未完成的程序版本都可以運(yùn)行起來秽誊,雖然程序未完成但是可以順利運(yùn)行鲸沮。這樣就使得我能夠邊寫程序邊進(jìn)行測(cè)試,來檢查程序運(yùn)行情況和哪部分程序還需要繼續(xù)改進(jìn)锅论。當(dāng)程序通過了所有的測(cè)試讼溺,編程就順利完成了!
打完 收工W钜住怒坯!