#ruby #ruby-on-rails-3 #refactoring
#ruby #ruby-on-rails-3 #рефакторинг
Вопрос:
Я хотел бы реорганизовать этот фрагмент кода, который совсем не СУХОЙ 🙂
def my_method
if session[:my_params].try(:include?, :answer)
session[:my_params][:answer]
elsif session[:my_params].try(:include?, :question)
session[:my_params][:question]
end
end
Есть ли способ неявно возвращать либо :answer
, либо :question
в зависимости от того, какой из них присутствует (если присутствует) в session[:my params]
?
Ответ №1:
Хэш будет возвращен, nil
если ключ не имеет значения, связанного с ним. Поскольку nil
и false
оба обрабатываются одинаково в условных обозначениях, мы можем очень агрессивно сократить этот метод. if session[:my_params]
Гарантирует, что session[:my_params]
значение не равно нулю.
def my_method
session[:my_params][:answer] || session[:my_params][:question] if session[:my_params]
end
Комментарии:
1. Отлично, отлично работает, я должен был подумать об этом раньше 🙂
Ответ №2:
def my_method
session[:my_params][:answer] || session[:my_params][:question]
end
вернет nil
, если ни то, ни другое не присутствует.
Это, конечно, предполагает, что значения [:answer]
и [:question]
не являются намеренно ложными, например false
.
Ответ №3:
def my_method
h = session.fetch(:my_params, {})
h[:answer] || h[:question]
end