2017-07-17 77 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)