【问题标题】:Newbie Ruby question - project basic calculator新手 Ruby 问题 - 项目基础计算器
【发布时间】:2020-08-28 22:37:18
【问题描述】:

我刚开始学习 ruby​​,我正在做一个小项目。我正在制作一个简单的两个数字计算器。我想要做的是让用户输入两个数字,然后询问他们是否想加/减/乘。我的问题是,如果用户不输入加/减/乘,我希望触发一条消息。假设用户键入 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

【问题讨论】:

  • 所以如果你仔细想想你写的东西,它真的没有意义,对吧?如果字符串 不等于 字符串数组,则会出现您的情况,这当然总是正确的。无论您是编程新手还是老手,研究示例和文档都是您经常要做的事情。尝试谷歌搜索“我如何检查数组是否包含 ruby​​ 中的项目”;你会找到很多相关的答案。
  • 谢谢!我肯定需要做更多的学习。我不知道如何搜索我正在寻找的东西,现在我也有一些阅读要做!
  • 没问题,如果我说的话看起来很苛刻,那不是故意的。学习如何识别你的问题/任务,然后研究如何解决它的最佳/替代实践是这项工作的基本技能之一。欢迎编程:-)
  • 不,不,我完全明白。我仍在弄清楚这一切,我完全会推动某人进行研究。我只需要发展词汇来寻找正确的方向。我肯定在这方面还没有。

标签: ruby calculator


【解决方案1】:

将 if 语句与 elsifelse 一起使用。

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

【讨论】:

    【解决方案2】:

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

    请注意,为了控制输入,我保留了to_i 转换(没有它,用户可以输入任意字符串,直接eval-ed 是不安全的)。哈希通过将字符串运算符转换为我们完全控制的哈希值来进一步控制输入。

    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 "..." 计算字符串。因为字符串是双引号的,所以 #{...} 中的值是插值的。因此,如果用户输入,例如,23add,则字符串将被插入到2 + 3,即5

    最后,根据 Ruby 编码约定,我将所有双引号替换为单引号。

    【讨论】:

    • 感谢您的建议。我会说,这远远超出了我的知识库。我参加了一个工作伙伴正在运行的编码课程的三个课程。我仍在尝试掌握数组和循环以及所有基本知识。这有点在我头上飞翔。我整个晚上都在阅读有关循环的内容,试图弄清楚如何循环我的代码的加/减/乘部分,直到用户输入加、减或乘。我可能只需要离开它一会儿。
    • 请改用op = { 'add' => :+, 'subtract' => :-, 'multiply' => :* }; op_str = 'add'; x = 2; y = 5; x.public_send(op[op_str], y) #=> 7; op_str = 'multiply'; x.public_send(op[op_str], y) #=> 10。也可以写成op = { 'add' => '+', 'subtract' => '-', 'multiply' => '*' }。使用eval时必须谨慎,因为存在潜在的安全问题。
    • @CarySwoveland 我认为您的评论应该是一个单独的(并接受,IMO)答案。它简洁、易于维护且安全。如果您将其作为答案,请联系我,然后我将删除我的(不太安全,基于 eval 的)答案。
    • 我提供 cmets 就像我正在审查一本书或文章的草稿一样。作者可以随意使用它们。我希望不会得到认可,但如果有任何认可,我希望它是在评论中的一般感谢,以免污染答案。我经常收到对我的答案有帮助的 cmets,我将其纳入我的答案中,删除了我以前写的任何不再取得成绩的东西。我的目标只是尽可能为提问者和其他读者提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多