#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 Спасибо за предложение сделать сравнение нечувствительным к регистру. Я обновил ответ.