问题描述
我刚刚开始学习红宝石,并且我正在做一个小项目。我正在制作一个简单的 2 数字计算器。我想要做的是让用户输入两个数字,然后询问他们是否要对它们进行加/减/乘。我的问题是,如果用户未输入加/减/乘运算,我希望触发一条消息。假设用户键入 Ad 而不是 Add ,我希望计算机说“我听不懂!”。我不确定如何执行此操作。
到目前为止,这是我的代码。
puts "Welcome to math.rb!"
puts "Enter a number!"
user = gets.to_i
puts "Enter another number!"
user2 = gets.to_i
puts "What would you like to do with your number? You can add,subtract,or multiply!"
math = gets.chomp.downcase
if math == "add"
puts user + user2
end
if math == "subtract"
puts user - user2
end
if math == "multiply"
puts user * user2
end
if math != ["add","subtract","multiply"]
puts "I don't understand"
end
解决方法
使用带有elsif
和else
的if语句。
math = gets.chomp.downcase
if math == "add"
puts user + user2
elsif math == "subtract"
puts user - user2
elsif math == "multiply"
puts user * user2
else
puts "I don't understand"
end
case
也适合该用例。
math = gets.chomp.downcase
case math
when "add"
puts user + user2
when "subtract"
puts user - user2
when "multiply"
puts user * user2
else
puts "I don't understand"
end
,
您可以进一步缩短代码,并使用hash存储允许的操作,并使用eval
将结果字符串作为算术表达式求值。尽管eval
在许多情况下都不安全,但在这里我们严格控制其输入,使其更加安全。
请注意,为了控制输入,我保留了to_i
转换(如果没有转换,用户可以输入任意字符串,直接进行eval
编辑是不安全的)。哈希将字符串运算符转换为我们完全控制的哈希值,从而进一步控制了输入。
puts 'Welcome to math.rb!'
puts 'Enter a number!'
x = gets.to_i
puts 'Enter another number!'
y = gets.to_i
puts 'What would you like to do with your number? You can add,subtract,or multiply!'
op_str = gets.chomp.downcase
op_str_to_math = { 'add' => '+','subtract' => '-','multiply' => '*' }
if op_str_to_math.key? op_str
puts eval "#{x} #{op_str_to_math[op_str]} #{y}"
else
puts "I don't understand"
end
op_str_to_math = { ... }
定义具有键=>
值对的哈希。可以像这样访问哈希的元素:
puts op_str_to_math['add'] # prints: +
puts op_str_to_math['subtract'] # prints: -
我们通过在op_str
哈希键中查找用户输入(if op_str_to_math.key? op_str
)来检查是否允许运算符。
eval "..."
计算字符串。由于该字符串被双引号引起来,因此将插值#{...}中的值。因此,如果用户输入了2
,3
,add
,则字符串将被插值到2 + 3
,即5
。
最后,根据Ruby编码约定,我在适当的地方用双引号替换了所有双引号。