Ruby скрипт проходит через бесконечный цикл вопросов - PullRequest
0 голосов
/ 17 ноября 2018

Итак, я изучаю рубин, и у меня есть скрипт, над которым я работаю.Он должен спросить ваше имя и номер, и определить, является ли число четным или нечетным.Если это даже, он напечатает сообщение, говорящее так.Если это странно, он попросит другой номер.Однако, если вы введете нечетное число, а затем попытаетесь ввести четное число, оно будет проходить через бесконечный цикл запроса другого числа.Любая помощь приветствуется!Код:

    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 голосов
/ 17 ноября 2018

для проверки нечетного или четного ruby ​​имеет встроенный метод odd?, который вернет true , если num равно odd , в нашем случае мы хотим создать цикл 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 , если мы не переписываем один и тот же набор кода, просто повторно используем этот блок с разными сообщениями. Справочник по процессу

0 голосов
/ 17 ноября 2018

Пожалуйста, прочитайте Как создать пример Minimal, Complete и Verifiable . Ваш текущий вопрос не дает достаточно данных, чтобы точно знать, каковы все проблемы. Например, ваш метод 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!'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...