Почему я застреваю в этом цикле While?

#ruby #while-loop #logical-operators

#ruby #цикл while #логические операторы

Вопрос:

Цикл While в Ruby
Я думаю, что проблема довольно проста, но я ее не совсем понимаю. Когда я отвечаю на правильный вариант, поэтому он может быть «Четным» или «неравномерным», он неоднократно задает мне вопрос. Думаю, проблема в or операторе

 puts 'Which numbers do you want to see, the even or uneven ones?'
answer = gets.chomp
    
 while answer != 'Uneven' or answer != 'Even'
   puts 'Please answer Even or Uneven.'
   answer = gets.chomp
 end
  

Есть ли способ написать while цикл с 2 вариантами, как здесь?

Комментарии:

1. Любопытно, что вы не спросили: `Какие числа вы хотите видеть, четные или нечетные?»

2. О, я не знал, что есть слово для «неравномерных» чисел. Английский не мой родной язык, но, думаю, каждый день узнаешь что-то новое! 🙂

3. Это было мое предположение… Я не могу устоять перед желанием помочь другим расширить свои знания английского языка.

Ответ №1:

Во-первых, условия должны быть связаны с помощью and вместо or .

 puts 'Which numbers do you want to see, the even or uneven ones?'
answer = gets.chomp

while answer != 'Even' and answer != 'Uneven'
  puts 'Please answer Even or Uneven.'
  answer = gets.chomp
end
  

Во-вторых, код можно улучшить дальше:
Не повторяйтесь: переместитесь gets.chomp внутрь цикла.
Добавьте downcase , чтобы пользователь мог вводить строку без учета регистра, например, odd , Odd , и т.д.
Создайте бесконечный цикл, используя loop do ... end и используйте break с if , чтобы легче выйти из цикла.
Цикл создает отдельную область, поэтому нам нужно сделать cur_answer видимой внешнюю область. Для этого сделайте так, чтобы цикл возвращал значение cur_answer с помощью break cur_answer ( break с аргументом возвращает этот аргумент).
Замените повторяющиеся != операторы, используя массив желаемых значений и include? . Массив строк можно легко создать, используя Percent Strings , здесь %w[...] .

 #!/usr/bin/env ruby

puts 'Which numbers do you want to see, even or odd ones?'

answer = loop do
  cur_answer = gets.chomp.downcase
  break cur_answer if %w[ even odd ].include? cur_answer
  puts 'Please answer even or odd.'
end

puts "answer=#{answer};"
  

Комментарии:

1. Я бы, вероятно, также сократил ответ для сравнения без учета регистра…

2. Большое вам спасибо!

3. @CarySwoveland Спасибо за ваши комментарии и множество полезных предложений по улучшению кода, особенно для использования break с аргументом для возврата значения из цикла! Я обновил ответ.

4. @nullTerminator Спасибо за предложение сделать сравнение нечувствительным к регистру. Я обновил ответ.