2011-11-18 53 views
2

我已檢查過該程序是否接收數字和名稱,它是。我想知道爲什麼當輸入數字是1時不打印「fred」?初學者Ruby如果其他

number = ARGF.read.chomp 
names = %w{fred betty barney} 
if number == 1 
    puts names[0] 
elsif number == 2 
    puts names[1] 
elsif number == 3 
    puts name[2] 
end 
+0

看起來像數是一個字符串,不應攀比像「1」,「2」和「3」? – aishwarya

回答

2

number是一個字符串,而不是一個整數。您可以轉換爲整數:

number = ARGF.read.chomp.to_i 

,或者你可以測試對字符串代替:

if number == "1" 
    ... 
    ... 
    ... 
+0

天哪,就是我寫的幾乎每一個程序都殺了我......轉換爲字符串和整數。無論如何,非常感謝您的答覆,非常感謝。 – jimmyc3po

4

number可能是一個字符串,在這裏,但你有一個整數比較它。

1 == '1' # false 

嘗試

number = ARGF.read.chomp.to_i # note the to_i here 
names = %w{fred betty barney} 
if number == 1 
    puts names[0] 
elsif number == 2 
    puts names[1] 
elsif number == 3 
    puts names[2] 
end 

此外,您還可以使用case/when語句時,你要基於單個變量的多個值,從而採取不同的路徑。這通常是處理這種類型流的更清潔的方式。

number = ARGF.read.chomp.to_i 
names = %w{fred betty barney} 

case number 
when 1 
    puts names[0] 
when 2 
    puts names[1] 
when 3 
    puts names[2] 
end 

或在這種情況下,就更簡單了:

number = ARGF.read.chomp.to_i 
names = %w{fred betty barney} 
puts names[number-1] 

應該工作。

+1

使用'case'語句有以下幾個好處:執行速度快,讀起來更容易,特別是當將多個值映射到單數動作時,由於不需要使用'或',並且不可能無意中將其與'='而不是與'=='比較。你也擔心,唯一的答案是承認這是一個數組索引問題,根本不需要這種邏輯。 – tadman

+0

「執行速度快得多」... [引用需要] – DGM

+0

不是引用,但至少相關:http://stackoverflow.com/questions/4178240/which-is-faster-in-ruby-a-hash -lookup-a-function-with-a-case-statement –

2

number是一個字符串。您可以檢查通過印刷它的類是這樣的:

p number.class 

您需要number轉換爲整數這樣的:

number = ARGF.read.chomp.to_i 

但請記住這to_i將爲無效的字符串返回0。只有當你確定傳入的數據時才這樣做。

試試這個在Codepad

3

我知道你正在學習if...else,但請記住,你也可以這樣做:

number = ARGF.read.chomp.to_i - 1 
names = %w{fred betty barney} 

puts names[number] 
+0

永遠不會想到這一點。 :D謝謝。 – jimmyc3po

+0

當我開始學習Ruby時,我也沒有! – clem