Ruby If-Else语法评估

Ruby If-Else语法评估,ruby,if-statement,Ruby,If Statement,我不明白为什么我的If-else语句不能正常工作,如果我输入'y',它就会计算If-else语句的最后一部分 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 "R

我不明白为什么我的If-else语句不能正常工作,如果我输入'y',它就会计算If-else语句的最后一部分

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
你找不到方法了。因为
\n
被附加到STDIN,您可以使用
\chomp
删除它

2.2.2 :032 > selection = gets
y
 => "y\n"
2.2.2 :033 > selection.chomp
 => "y"
您可以按如下方式更新代码:

selection = gets.to_s.chomp.upcase

if selection == 'Y'
  puts "Result is #{nr1+nr2}"
elsif selection == 'V'
  puts "Result is #{nr1-nr2}"
elsif selection == 'K'
  puts "Result is #{nr1*nr2}"
else
  puts 'Invalid input'
end
尽管如此,ruby
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 "Invalid input. Please provide a valid input [Y/V/K]"
end
你找不到方法了。因为
\n
被附加到STDIN,您可以使用
\chomp
删除它

2.2.2 :032 > selection = gets
y
 => "y\n"
2.2.2 :033 > selection.chomp
 => "y"
您可以按如下方式更新代码:

selection = gets.to_s.chomp.upcase

if selection == 'Y'
  puts "Result is #{nr1+nr2}"
elsif selection == 'V'
  puts "Result is #{nr1-nr2}"
elsif selection == 'K'
  puts "Result is #{nr1*nr2}"
else
  puts 'Invalid input'
end
尽管如此,ruby
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 "Invalid input. Please provide a valid input [Y/V/K]"
end

养成的一个好习惯是将其分解成适当的
案例
陈述:

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。我已经将这里的do调整为
选择中的不区分大小写匹配,将其用作
大小写
操作的对象。

一个好习惯是将其分解为一个适当的
大小写
语句:

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。我已经将这里的do调整为
选择
上的不区分大小写匹配,将其用作
大小写
操作的对象。

一个选项是使用哈希

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

一种选择是使用散列

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


else(selection==“k”.upcase)
将被视为普通
else
。可能您希望
elsif
就位。我尝试过切换它,但没有任何效果,如果我输入“y”、“v”或“k”,它不会打印结果。您希望
if selection.chomp.downcase==“y”
(或
if selection.chomp.upcase==“y”
gets.to_s
gets
相同<代码>获取总是返回以换行符结尾的字符串(
“\n”
)。您需要
gets.chomp
删除该换行符。
else(selection==“k”.upcase)
将被视为普通
else
。可能您希望
elsif
就位。我尝试过切换它,但没有任何效果,如果我输入“y”、“v”或“k”,它不会打印结果。您希望
if selection.chomp.downcase==“y”
(或
if selection.chomp.upcase==“y”
gets.to_s
gets
相同<代码>获取总是返回以换行符结尾的字符串(
“\n”
)。您需要
gets.chomp
删除该换行符。
“y”.upcase
可以简化吗?这真的是你想要的吗?任何原因
中的
to_s
都会得到.to_s.chomp
?@CarySwoveland是的,不需要
to_s
。更新了答案。如果selection.upcase==“Y”
就是这里想要的,我很确定
可以简化
“Y”。upcase
吗?这真的是你想要的吗?任何原因
中的
to_s
都会得到.to_s.chomp
?@CarySwoveland是的,不需要
to_s
。更新了答案。我很确定
if selection.upcase==“Y”
就是这里的目的。谢谢,我的问题是我输入了“Y”,if语句等待大写的“Y”,这就是它没有执行的原因。是的,你差点就完成了,但事情有点混乱。希望这有助于澄清。@CarySwoveland将字符串映射到操作并使用
send
的查找表绝对是更好的解决方案。另一种选择是使用哈希<代码>h={'Y'=>:+,'V'=>:-,'K'=>:*};selection=gets.chomp.upcase;将“Result is#{nr1.send(h[selection],nr2)}”放在if h.key?(selection)
@CarySwoveland您可能应该添加它作为一个替代答案,只是出于教育目的。谢谢,我的问题是我输入了“y”,而if语句正在等待大写的“y”,这就是它没有执行的原因。是的,您差点就得到了它,但事情有点混乱。希望这有助于澄清。@CarySwoveland将字符串映射到操作并使用
send
的查找表绝对是更好的解决方案。另一种选择是使用哈希<代码>h={'Y'=>:+,'V'=>:-,'K'=>:*};selection=gets.chomp.upcase;如果h.key?(selection)@caryswovel,则将“Result is#{nr1.send(h[selection],nr2)}”置于“如果h.key?(selection)@caryswovel,您可能应该将其添加为一个替代答案,仅用于教育目的。