現(xiàn)在我們將前面的一些示例程序的代碼坼開來(lái)分析一下.
下面的例子出現(xiàn)在簡(jiǎn)單的例子一節(jié).
def fact(n)
if n == 0
1
else
n * fact(n-1)
end
end
print fact(ARGV[0].to_i), "/n"
因?yàn)槭堑谝淮谓忉?我們將逐行分析.
def fact(n)
第一行,def 用于定義一個(gè)函數(shù)(或者,更準(zhǔn)確地說(shuō),一個(gè)方法(method);我們會(huì)在稍后的一節(jié)中詳細(xì)討論什么是一個(gè)方法).這里,它指明 fact 函數(shù)帶一個(gè)參數(shù),也就是 n.
if n == 0
if 用來(lái)檢查一個(gè)條件.當(dāng)條件吻合時(shí),執(zhí)行下面的代碼;否則執(zhí)行跟在else后的代碼.
1
當(dāng)條件成立時(shí)if 的值為 1.
else
如果條件不成立,執(zhí)行從這里到end的代碼.
n * fact(n-1)
如果條件不滿足, if的值會(huì)是n乘fact(n-1)的結(jié)果.
end
第一個(gè) end 與 if 語(yǔ)句對(duì)應(yīng).
end
第二個(gè) end 與 def 語(yǔ)句對(duì)應(yīng).
print fact(ARGV[0].to_i), "/n"
這句用由命令行指定的值來(lái)調(diào)用fact()函數(shù)并打印結(jié)果.
ARGV是一個(gè)包含命令行參數(shù)的數(shù)組.ARGV的成員是字符串,所以我們必須通過(guò)to_i轉(zhuǎn)化其為整數(shù). Ruby并不像Perl那樣自動(dòng)將字符串轉(zhuǎn)化為整數(shù).
Hmmm...如果向程序賦一個(gè)負(fù)值作為參數(shù)會(huì)怎樣?你看到這個(gè)問(wèn)題了嗎?你可以修復(fù)它嗎?
Strings
下面我們來(lái)檢查在字符串這章中出現(xiàn)的猜謎程序.由于這個(gè)要長(zhǎng)一點(diǎn),我們?yōu)槊恳恍写蛏闲袛?shù).
01 words = ['foobar', 'baz', 'quux']
02 secret = words[rand(3)]
03
04 print "guess? "
05 while guess = STDIN.gets
06 guess.chop!
07 if guess == secret
08 print "you win/n"
09 break
10 else
11 print "you lose./n"
12 end
13 print "guess? "
14 end
15 print "the word is ", secret, "./n"
這個(gè)程序里,我們使用了一個(gè)新的控制結(jié)構(gòu) while.只要某個(gè)指定的條件保持為真,while和它對(duì)應(yīng)的end之間的代碼會(huì)重復(fù)執(zhí)行.
行2的rand(3)返回一個(gè)介于0-2之間的隨機(jī)數(shù).這個(gè)隨機(jī)數(shù)用于提取數(shù)組 words 中的一個(gè)成員.
在行5我們通過(guò)STDIN.gets方法從標(biāo)準(zhǔn)輸入讀取一行.如果讀行遇到時(shí) EOF (文件結(jié)束), gets會(huì)返回nil.因此,與while相連的代碼會(huì)一直執(zhí)行直到它遇到^D(或DOS下的^Z),表示輸入的結(jié)束.