Как повторить конкретное утверждение, где ошибки возникают в ruby - PullRequest
0 голосов
/ 11 февраля 2020

Я запрашиваю пользовательские вводы и проверяю эти входные данные, если проверка не проходит, я прошу пользователя ввести действительный ввод ...

Вот как я делаю это


     begin 

          enter_user_first_name
          is_first_name_valid?

          enter_user_last_name
          is_last_name_valid?.

          enter_user_age
          greater_than_eq_18?

          enter_user_gender
          gender_valid?

     rescue => error
        p error
        retry
     else

     end

Здесь сначала Я ввожу ввод и затем проверяю, но проблема, с которой я сталкиваюсь, состоит в том, что, когда один оператор между ними терпит неудачу, он начинает выполнять все операторы блока begin снова, например, если пользователь вводит фамилию неправильно, он начинает спрашивать имя снова, вместо того, чтобы спрашивать просто фамилия.

Как я могу это сделать?

1 Ответ

3 голосов
/ 11 февраля 2020

Вы можете создать вспомогательный метод и затем вызвать его для каждого из блоков, которые можно повторить:

def with_retry
  begin
    yield
  rescue => error
    puts error
    retry
  end
end

with_retry do
  enter_user_first_name
  is_first_name_valid?
end

with_retry do
  enter_user_last_name
  is_last_name_valid?
end

with_retry do
  enter_user_age
  greater_than_eq_18?
end

with_retry do
  enter_user_gender
  gender_valid?
end

с send (однако я бы посоветовал против использования send слишком много в вашей программе, это может затруднить понимание того, что происходит)

operations = {
  enter_user_first_name: :is_first_name_valid?,
  enter_user_last_name:  :is_last_name_valid?,
  enter_user_age:        :greater_than_eq_18?,
  enter_user_gender:     :gender_valid?
}

operations_each do |input_fn, validation_fn|
  begin
    send(input_fn)
    send(validation_fn)
  rescue => e
    puts e
    retry
  end
end

end

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...