Я ищу чистый способ оценить object
и вернуть object
, если условие проверено, nil
в противном случае, чтобы вместо этого использовать значение по умолчанию. Что-то вроде:Держите, если на объекте
result = object.verify?{ |object| object.test? } || default_value
Я вижу несколько путей реализации этого, но я надеюсь, что есть встроенный способ сделать это. Пример:
Переход к
Array
уровняdef verify?(&block) Array(self).filter(block).first end
Использование
instance_eval
def verify?(&block) self.instance_eval{ |object| yield(object) ? object : nil} end
EDIT
Вот мой конкретный пример (хотя вопрос не обтянутый к нему):
class User < ActiveRecord::Base
def currency
self.billing_information.try(:address).try(:country).try(:currency_code).instance_eval{ |currency| Finance::CURRENCIES.include?(currency) ? currency : nil} || 'EUR'
end
end
Я знаю, что это некрасиво, но я, как логика этого: если объект Я ищу существует, переходите к следующему. Первые условия - существование (с try
), затем включение.
Вам не нужна эта вещь 'instance_eval', на первый взгляд. Почему бы просто не «уступить» («я»)? self: nil'? –
Не понятно, какое значение вы хотите, когда условие выполнено. Вы хотите «истинный»? – sawa
Очень странный вопрос. Почему бы не просто 'result = object.test? || default_value'? –