現在我們將前面的一些示例程序的代碼坼開來分析一下.
下面的例子出現在簡單的例子一節.
def fact(n)
if n == 0
1
else
n * fact(n-1)
end
end
print fact(ARGV[0].to_i), "/n"
因為是第一次解釋,我們將逐行分析.
def fact(n)
第一行,def 用于定義一個函數(或者,更準確地說,一個方法(method);我們會在稍后的一節中詳細討論什么是一個方法).這里,它指明 fact 函數帶一個參數,也就是 n.
if n == 0
if 用來檢查一個條件.當條件吻合時,執行下面的代碼;否則執行跟在else后的代碼.
1
當條件成立時if 的值為 1.
else
如果條件不成立,執行從這里到end的代碼.
n * fact(n-1)
如果條件不滿足, if的值會是n乘fact(n-1)的結果.
end
第一個 end 與 if 語句對應.
end
第二個 end 與 def 語句對應.
print fact(ARGV[0].to_i), "/n"
這句用由命令行指定的值來調用fact()函數并打印結果.
ARGV是一個包含命令行參數的數組.ARGV的成員是字符串,所以我們必須通過to_i轉化其為整數. Ruby并不像Perl那樣自動將字符串轉化為整數.
Hmmm...如果向程序賦一個負值作為參數會怎樣?你看到這個問題了嗎?你可以修復它嗎?
Strings
下面我們來檢查在字符串這章中出現的猜謎程序.由于這個要長一點,我們為每一行打上行數.
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"
這個程序里,我們使用了一個新的控制結構 while.只要某個指定的條件保持為真,while和它對應的end之間的代碼會重復執行.
行2的rand(3)返回一個介于0-2之間的隨機數.這個隨機數用于提取數組 words 中的一個成員.
在行5我們通過STDIN.gets方法從標準輸入讀取一行.如果讀行遇到時 EOF (文件結束), gets會返回nil.因此,與while相連的代碼會一直執行直到它遇到^D(或DOS下的^Z),表示輸入的結束.