我正在询问用户输入并验证输入,如果验证失败,我正在询问用户输入有效输入...
这就是我的做法
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块的所有语句,例如,如果用户输入的姓氏不正确,它将开始再次询问名字,而不仅仅是询问姓氏。
我该怎么做?
您可以创建一个辅助方法,然后为每个可以重试的块调用它:
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
with 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
结束