Ruby脚本经历无尽的问题循环

时间:2018-11-17 01:45:11

标签: ruby

所以我正在学习红宝石,并且我正在使用一个脚本。应该询问您的姓名和电话号码,然后确定电话号码是偶数还是奇数。如果它是偶数,它将打印一条消息,说明是这样。如果很奇怪,它将要求另一个数字。但是,如果您输入一个奇数,然后尝试输入一个偶数,它将经历无休止的询问另一个数字的循环。 任何帮助表示赞赏! 代码:

    name = ask "What is your name?"
    num = ask name + ", " + "Enter a number"
    sumNum = num % 2
    while(sumNum != 0)
    num = ask "Pick another number" 
    end

    puts name + " picked an even number!"

2 个答案:

答案 0 :(得分:0)

请阅读How to create a Minimal, Complete, and Verifiable example。您当前的问题没有提供足够的数据来确定所有问题是什么。例如,您的ask方法未定义。这意味着我不得不猜测你在做什么。

但是我可以肯定地告诉您,这个代码是一个问题:

while(sumNum != 0)
  num = ask "Pick another number" 
end

您的循环条件基于sumNum,但是您循环中的任何地方都没有做任何会修改sumNum的事情。一个幼稚的方法可能是:

while(sumNum != 0)
  <do something that modifies the value of sumNum>
end

但是由于我遗漏了其余的代码,所以我想将您的代码重构为可以正常工作的代码:

puts 'What is your name?'
name = gets.chomp

# Don't use while/end: https://stackoverflow.com/a/10713963/3784008
loop do
  puts 'Enter a number'
  # gets returns a string that must be converted to an Integer
  num = gets.chomp.to_i
  # No need for % if all you care about is determining parity
  break if num.even?
end

puts name + ' picked an even number!'

答案 1 :(得分:0)

用于检查奇数或偶数红宝石的内置方法odd?如果在我们的情况下num奇数,则会返回 true 想要创建while循环,直到我们输入的数字为奇数为止。因此,我们可以做一些与此相关的事情。

require 'highline/import'

name = ask "What is your name?"
ask_num = Proc.new {|msg| ask name + ", " + msg } #block code which can reused.
num = ask_num.call("Enter a number")
while num.to_i.odd? # loop works until num is odd
  num = ask_num.call("Pick another number")
end
puts name + " picked an even number!"

Proc对象是可以根据不同上下文调用的代码块。在这里,我们使用它来显示不同的消息,同时输入数字并重试。这有助于遵循 Dry 策略,因为我们不是在重写同一组代码,而只是将此块与不同的消息一起使用。 Proc Reference