Вызов метода, только если он существует
Есть ли скрытая Ruby/Rails-magic для простого вызова метода только в том случае, если он существует?
Предположим, что я хочу позвонить
resource.phone_number
но я не знаю заранее, если ресурс отвечает на phone_number
. Способ сделать это -
resource.phone_number if resource.respond_to? :phone_number
Это не все, что красиво, если используется в неправильном месте. Мне любопытно, существует ли что-то, что работает больше в соответствии с тем, как try
используется (resource.try(:phone_number)
).
Ответы
Ответ 1
Если вас не устраивает стандартный синтаксис ruby для этого, вы можете:
class Object
def try_outside_rails(meth, *args, &cb)
self.send(meth.to_sym, *args, &cb) if self.respond_to?(meth.to_sym)
end
end
Теперь:
resource.try_outside_rails(:phone_number)
будет вести себя так, как вам хотелось.
Ответ 2
Я знаю, что это очень старый пост. Но просто хотел узнать, может ли это быть возможным ответом и будет ли воздействие одинаковым.
resource.try(:phone_number) rescue nil
Спасибо
Ответ 3
Я бы попробовал defined?
(http://ruby-doc.org/docs/keywords/1.9/Object.html#defined-3F-method). Кажется, это точно то, о чем вы просите:
resource.phone_number if defined? resource.phone_number
Ответ 4
Начиная с Ruby 2.3.0 (который до сих пор находится в предварительном просмотре) вы можете использовать новый безопасный оператор навигации запрос функции в системе отслеживания ошибок Ruby. Я также объяснил аргументы в своем ответе здесь.
Ответ 5
Если A.c
определено и A.a
и A.b
нет, вы можете сделать A.a rescue A.b rescue A.c
, и он будет работать как шарм. Однако вы будете нарушать некоторые глупые правила.