ActiveSupport 4.0.0 определяет два try
методы: one для Object
экземпляров:
class Object
def try(*a, &b)
if a.empty? && block_given?
yield self
else
public_send(*a, &b) if respond_to?(a.first)
end
end
end
other для NilClass
экземпляров (nil
объектов):
class NilClass
def try(*args)
nil
end
end
Теперь предположим, что мы имеем Object
экземпляр (за исключением nil
, который фактически наследует от Object
, как и все остальное в Ruby), def ining метод, который возвращает nil
:
class Test
def returns_nil
nil
end
end
Так, бег Test.new.try(:returns_nil)
или Test.new.not_existing_method
, Object#try
будет называться, который будет проверять, если публичный метод существует (в respond_to?
); если он это сделает, он вызовет метод (public_send)
, иначе он вернется nil
(других строк нет).
Если мы называем другой try
на этих вернувшихся nil
методов:
Test.new.try(:returns_nil).try(:any_other_method)
Test.new.try(:not_existing_method).try(:any_other_method)
мы будем называть NilClass#try
, который nil#try
, который просто игнорирует все и возвращает nil
. Таким образом, любой другой try
будет вызываться на примере nil
и вернуть nil
.
«Если вы попытаетесь вызвать метод на объекте« nil »... возникает исключение» => Неверно. «Если вы попытаетесь вызвать метод ** undefined для' NilClass' ** на 'nil' ... exception возникает" => Исправить. – sawa