新手Ruby问题-project basic计算器

新手Ruby问题-project basic计算器,ruby,calculator,Ruby,Calculator,我刚开始学习ruby,我正在做一个小项目。我在做一个简单的两位数计算器。我想做的是让用户输入两个数字,然后问他们是否愿意加/减/乘。我的问题是,如果用户没有输入加法/减法/乘法,我希望触发一条消息。说用户输入广告而不是添加,我想让计算机说我不明白!我不知道该怎么做 这是到目前为止我的代码 puts "Welcome to math.rb!" puts "Enter a number!" user = gets.to_i puts "En

我刚开始学习ruby,我正在做一个小项目。我在做一个简单的两位数计算器。我想做的是让用户输入两个数字,然后问他们是否愿意加/减/乘。我的问题是,如果用户没有输入加法/减法/乘法,我希望触发一条消息。说用户输入广告而不是添加,我想让计算机说我不明白!我不知道该怎么做

这是到目前为止我的代码

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
将if语句与elsif和else一起使用

对于这个用例,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
将if语句与elsif和else一起使用

对于这个用例,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

您可以进一步缩短代码并使用来存储允许的操作,并将结果字符串作为算术表达式进行求值。尽管eval在很多情况下并不安全,但我们严格控制它的输入,使其更加安全

注意,为了控制输入,我保留了to_I转换,没有它,用户可以输入任意字符串,直接求值是不安全的。散列通过将字符串运算符转换为我们完全控制的散列值来进一步控制输入

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={…}使用key=>value对定义哈希。散列的元素可以这样访问:

puts op_str_to_math['add'] # prints: +
puts op_str_to_math['subtract'] # prints: -
我们通过在散列键中查找用户输入op_str来检查操作符是否被允许:if op_str_to_math.key?op_街

评估。。。计算字符串的值。因为字符串是双引号,{…}中的值是内插的。因此,如果用户输入,例如,2,3,add,字符串将被插值为2+3,即5


最后,根据Ruby编码惯例,在适当的情况下,我将所有双引号替换为单引号。

您可以进一步缩短代码,使用a存储允许的操作,并将结果字符串作为算术表达式进行计算。尽管eval在很多情况下并不安全,但我们严格控制它的输入,使其更加安全

注意,为了控制输入,我保留了to_I转换,没有它,用户可以输入任意字符串,直接求值是不安全的。散列通过将字符串运算符转换为我们完全控制的散列值来进一步控制输入

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={…}使用key=>value对定义哈希。散列的元素可以这样访问:

puts op_str_to_math['add'] # prints: +
puts op_str_to_math['subtract'] # prints: -
我们通过在散列键中查找用户输入op_str来检查操作符是否被允许:if op_str_to_math.key?op_街

评估。。。计算字符串的值。因为字符串是双引号,{…}中的值是内插的。因此,如果用户输入,例如,2,3,add,字符串将被插值为2+3,即5


最后,根据Ruby编码惯例,我在适当的地方用单引号替换了所有双引号。

所以如果你想一想你写的东西,它就没有什么意义了,对吗?如果字符串不等于字符串数组,则会发生这种情况,当然,这总是正确的。无论您是编程新手还是老手,研究示例和文档都是您经常做的事情。尝试用谷歌搜索如何检查数组是否包含ruby中的项;你会找到很多相关的答案。谢谢!我确实需要做更多的学习。我不知道如何搜索我正在寻找的东西,现在我也有一些阅读要做!没问题,只是想弄清楚,如果我说的话听起来很严厉,那不是故意的。学习如何识别你的问题/任务,然后研究如何解决它的最佳/替代实践是这份工作的基本技能之一。欢迎来到编程:-不,不,我完全理解。我仍然在搞清楚这一切,我完全开始推动别人去做这项研究。我只需要发展词汇来寻找正确的方向。我肯定在这方面还没有做到。所以,如果你想想你写的东西,它真的没有意义,对吗?如果字符串不等于字符串数组,则会发生这种情况,当然,这总是正确的。无论您是编程新手还是老手,研究示例和文档都是您经常做的事情。尝试用谷歌搜索如何检查数组是否包含ruby中的项;你会找到很多相关的答案。谢谢!我确实需要做更多的学习。我不知道如何搜索我正在寻找的东西,现在我也有一些阅读要做!没问题,只是想弄清楚,如果我说的话听起来很严厉,那不是故意的。学习如何识别你的问题/任务,然后研究如何解决它的最佳/替代实践是这份工作的基本技能之一。欢迎来到编程:-不,不,我完全理解。我仍然在搞清楚这一切,我完全开始推动别人去做这项研究。我只需要发展词汇来寻找正确的方向。我肯定那方面还没有
t、 谢谢你的建议。我会说,这远远超出了我的知识基础。我参加了三次编码课程,一个同事正在运行。我仍在努力掌握数组和循环以及所有基本知识。现在这有点像是从我头上飞过。我整个晚上都在读循环,试图找出如何循环代码的加法/减法/乘法部分,直到用户输入加法、减法或乘法。我可能只是需要离开它一点。考虑OP= { 'Addi'=>:+,‘减法’=>:-,“乘法”=>:*};op_str='添加';x=2;y=5;x、 公共空间[op_str],y=>7;op_str=‘乘法’;x、 公共空间[op_str],y=>10。也可以编写op={'add'=>'+'、'subtract'=>'-'、'multiply'=>'*'}。由于潜在的安全问题,使用eval时必须谨慎。@CarySwoveland我认为你的评论应该是一个单独的、被接受的回答。它简单、易于维护、安全。如果你把它变成一个答案,请ping我,然后我会删除我不太安全的,基于评估的答案。我会提供评论,就像我在审阅一本书或一篇文章的草稿一样。作者可以随意使用它们。我不希望得到任何认可,但如果得到认可,我更希望在评论中用一般性的感谢,以免污染答案。我经常收到对我的答案有帮助的评论,我将这些评论纳入了我的答案中,删除了我以前写的任何不再得分的东西。我的目标就是尽可能地帮助提问者和其他读者。谢谢你的建议。我会说,这远远超出了我的知识基础。我参加了三次编码课程,一个同事正在运行。我仍在努力掌握数组和循环以及所有基本知识。现在这有点像是从我头上飞过。我整个晚上都在读循环,试图找出如何循环代码的加法/减法/乘法部分,直到用户输入加法、减法或乘法。我可能只是需要离开它一点。考虑OP= { 'Addi'=>:+,‘减法’=>:-,“乘法”=>:*};op_str='添加';x=2;y=5;x、 公共空间[op_str],y=>7;op_str=‘乘法’;x、 公共空间[op_str],y=>10。也可以编写op={'add'=>'+'、'subtract'=>'-'、'multiply'=>'*'}。由于潜在的安全问题,使用eval时必须谨慎。@CarySwoveland我认为你的评论应该是一个单独的、被接受的回答。它简单、易于维护、安全。如果你把它变成一个答案,请ping我,然后我会删除我不太安全的,基于评估的答案。我会提供评论,就像我在审阅一本书或一篇文章的草稿一样。作者可以随意使用它们。我不希望得到任何认可,但如果得到认可,我更希望在评论中用一般性的感谢,以免污染答案。我经常收到对我的答案有帮助的评论,我将这些评论纳入了我的答案中,删除了我以前写的任何不再得分的东西。我的目标只是尽可能地帮助询问者和其他读者。