Могу ли я вспомнить «дело» в случае? - PullRequest
1 голос
/ 12 апреля 2020

Я хочу вспомнить случай, пока пользователь не напишет a или b. Я не хочу использовать «дело» особенно.

Я просто хочу получить ввод от пользователя, но не получить что-то еще. Если он пишет что-то еще, ему нужно писать, пока он не напишет a или b.

str = gets.chomp.to_s
case str
when "a"
    print "nice a"
when "b" 
    puts "nice b"
else 
    puts "please do it again"
end 

class person
 attr_accessor :name , :surname #and other attributes
end

#There will be a method here and it will run when the program is opened.
#The method will create the first object as soon as the program is opened. 
#The new object that the user will enter will actually be the 2nd object.

puts "What do you want to do?
add
list
out"

process = gets.chomp.to_s

case process
when "add"
    #in here user will add new objects of my class
when "list" 
    #in here user will show my objects
when "out"
    puts "Have a nice day"
else 
    puts "please do it again"   
end

Фактически, если вы посмотрите на это, многие действия будут предприняты в результате действий пользователя. ввод правильного ввода. то, что я хочу рассказать, более подробно в этом примере. По словам пользователя, будут такие действия, как вызов методов, добавление объектов и т. Д. c.

Я написал большую часть кода на своем компьютере. Но все же я не смог решить свою первую проблему.

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

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

См. Также

1 голос
/ 12 апреля 2020

«Я просто хочу сделать что-то, пока что-то еще не произойдет» - это когда вы используете while l oop.

Вы можете сделать это:

while true
  str = gets.chomp
  break unless str == 'a' || str == 'b'  
  puts "please do it again"
end 

Вы также можете использовать loop do:

loop do
  str = gets.chomp
  break unless ['a', 'b'].include?(str) 
  puts "please do it again"
end 

puts "Nice #{str}."

Рубиисты обычно предпочитают loop do над while true. Они делают одно и то же.

Еще одна вещь. Есть более простой способ выписать массивы строк:

loop do
  str = gets.chomp
  break unless %w(a b).include?(str) 
  puts "please do it again"
end 

puts "Nice #{str}."

Это не выглядит намного проще, но если у вас есть, скажем, 10 строк, то определенно быстрее набрать, когда вы не не нужно использовать все эти кавычки.

Как подсказывала ваша интуиция, вам вовсе не нужно использовать оператор case. Как попытка убить блоху кувалдой. Самый краткий способ проверки - проверить, включен ли входной символ в массив требуемых символов.

...