2017-07-17 154 views
0

我不明白爲什麼我的If else語句無法正常工作,如果我輸入'y',那麼它會評估if else語句的最後部分。Ruby如果其他語法評估

puts('give 1: ') 
nr1= Integer(gets) 
puts('give 2: ') 
nr2= Integer(gets) 

selection = gets.to_s 

if (selection == "y".upcase) 
    puts "Result is #{nr1+nr2}" 
elsif (selection =="v".upcase) 
    puts "Result is #{nr1-nr2}" 
else (selection == "k".upcase) 
    puts "Result is #{nr1*nr2}" 
end 
+1

'else(selection ==「k」.upcase)'將被視爲普通的'else'。可能你想'elsif'到位。 –

+0

我曾嘗試切換它,但它沒有任何效果,如果輸入'y','v'或'k',它不打印結果。 –

+0

你想'如果selection.chomp.downcase ==「y」'(或'如果selection.chomp.upcase ==「Y」')。 'gets.to_s'與'gets'相同。 'gets'總是返回一個以換行符結尾的字符串('「\ n」')。你需要'gets.chomp'去除那個換行符。 –

回答

1

你錯過#chomp方法。由於\n被附加到STDIN,您可以使用#chomp刪除它。

2.2.2 :032 > selection = gets 
y 
=> "y\n" 
2.2.2 :033 > selection.chomp 
=> "y" 

如下您可以更新您的代碼:

selection = gets.to_s.chomp 

if selection == "y".upcase 
    puts "Result is #{nr1+nr2}" 
elsif selection =="v".upcase 
    puts "Result is #{nr1-nr2}" 
elsif selection == "k".upcase 
    puts "Result is #{nr1*nr2}" 
else 
    puts "Invalid input" 
end 

雖然紅寶石case將最適合在這裏。喜歡的東西:

case selection 
when 'Y' 
    puts "Result is #{nr1 + nr2}" 
when 'V' 
    puts "Result is #{nr1 - nr2}" 
when 'K' 
    puts "Result is #{nr1 * nr2}" 
else 
    puts "Invalid input. Please provide a valid input [Y/V/K]" 
end 
+0

可以簡化''y「.upcase'嗎?那真的是你想要的嗎?任何爲什麼'gets_to_s.chomp'中的to_s'? –

+0

@CarySwoveland是的,不需要'#to_s'。更新了答案。 –

+0

我很確定'如果selection.upcase ==「Y」'是這裏的意圖。 –

4

一個很好的習慣進入是打破了這一點到合適的case聲明:

case (selection.upcase) 
when 'Y' 
    puts "Result is #{nr1+nr2}" 
when 'V' 
    puts "Result is #{nr1-nr2}" 
when 'K' 
    puts "Result is #{nr1*nr2}" 
else 
    puts "I don't know what you mean." 
end 

現在需要注意的是selection == "y".upcase比較selection"Y"是很重要的,它不upcase您的選擇。我已經在selection上對此進行了調整,將其作爲case運行的內容。

+0

謝謝,我的問題是我輸入'y',if語句正在等待大寫'Y',這就是爲什麼它沒有執行。 –

+0

是的,你幾乎擁有它,但事情有點混亂。希望這有助於澄清。 – tadman

+0

@CarySwoveland一個查找表將字符串映射到操作並使用'send'在這裏絕對是一個更好的解決方案。 – tadman

0

一種選擇是使用散列。

h = { 'Y'=>:+, 'V'=>:-, 'K'=>:* } 
selection = gets.chomp.upcase 
puts "Result is #{nr1.public_send(h[selection], nr2)}" if h.key?(selection)