Ответ 1
См. этот вопрос. ActiveSupport добавляет метод presence
ко всем объектам, которые возвращают его ресивер, если present?
(противоположность blank?
) и nil
иначе.
Пример:
host = config[:host].presence || 'localhost'
Я часто пишу код для предоставления значения по умолчанию при столкновении с нулевым/пустым значением.
например:
category = order.category || "Any"
# OR
category = order.category.empty? ? "Any" : order.category
Я собираюсь расширить метод try
для обработки этой идиомы.
category = order.try(:category, :on_nill => "Any")
# OR
category = order.try(:category, :on_empty=> "Any")
Мне интересно, имеет ли Rails/Ruby какой-либо метод обработки этой идиомы?
Примечание:
Я пытаюсь исключить повторение терминов || / or / ?
на основе оператора.
По сути, я ищу эквивалент метода try
для обработки сценариев замены по умолчанию.
Без try
метода:
product_id = user.orders.first.product_id unless user.orders.first.nil?
С помощью метода try
:
product_id = user.orders.first.try(:product_id)
Легко реализовать общий подход для обработки этой идиомы, но я хочу убедиться, что я не изобретаю колесо.
См. этот вопрос. ActiveSupport добавляет метод presence
ко всем объектам, которые возвращают его ресивер, если present?
(противоположность blank?
) и nil
иначе.
Пример:
host = config[:host].presence || 'localhost'
Возможно, это может случиться:
class Object
def subst_if(condition, replacement)
condition = send(condition) if condition.respond_to?(:to_sym)
if condition
replacement
else
self
end
end
end
Используется так:
p ''.subst_if(:empty?, 'empty') # => "empty"
p 'foo'.subst_if(:empty?, 'empty') # => "foo"
Он также принимает автономные условия, не связанные с объектом:
p 'foo'.subst_if(false, 'bar') # => 'foo'
p 'bar'.subst_if(true, 'bar') # => 'bar'
Я не сумасшедший по поводу имени subst_if
. Я бы использовал любое имя Lisp для этой функции, если бы знал это (если оно существует).
Довольно уверен, что его не запекли. Вот ссылка на аналогичный вопрос/ответ. Это подход, который я принимаю. Использование синтаксиса ruby: ||=
В стороне: Этот вопрос также напоминает мне о первых Railscasts всех времен: Кэширование с переменными экземпляра который является полезным скринкастом, если вам нужно выполнить эту операцию в контроллере