Использование ядра # l oop
Существует много способов решения этой проблемы, но давайте начнем с простой оболочки Kernel # l oop вокруг существующего кода , поскольку это, вероятно, самый простой путь для вас.
loop do
str = gets.chomp.to_s
case str
when "a"
print "nice a"
when "b"
puts "nice b"
else
puts "please do it again"
# restart your loop when not "a" or "b"
next
end
# exit the loop if else clause wasn't triggered
break
end
Использование until
Управляющее выражение
Вышеприведенная конструкция l oop довольно проста, но она требует от вас обдумать где вам нужно следующий и прервать операторы для управления потоком. Моим собственным инстинктом было бы просто вызвать блок, пока он не станет правдивым. Например, базовый лог c может быть сокращен до:
str = nil; until str =~ /a|b/i do str = gets.chomp end; p str
Это намного короче, но не особенно удобно для пользователя. Чтобы использовать этот подход, делая решение более коммуникативным и устойчивым к ошибкам, я бы реорганизовал исходный код следующим образом:
# enable single-character input from console
require 'io/console'
# make sure you don't already have a value,
# especially in a REPL like irb
str = nil
until str =~ /a|b/ do
printf "\nLetter (a, b): "
str = STDIN.getch.downcase
end
puts "\nYou entered: #{str}"
Хотя он не намного короче исходного кода, он обрабатывает больше крайних случаев и избегает ветвления. Это также кажется мне менее загроможденным, но это больше вопрос стиля. Этот подход и его смысл c также кажутся мне более читабельными, но ваш пробег может законно меняться.
См. Также