ActiveSupport 4.0.0 定义了两种try方法:一种是用于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
另一个是NilClass实例(对象nil):
class NilClass
def try(*args)
nil
end
end
现在,假设我们有一个Object实例(不包括nil,它实际上继承自Object,就像 Ruby 中的其他所有内容一样),定义了一个返回的方法nil:
class Test
def returns_nil
nil
end
end
因此,将调用运行Test.new.try(:returns_nil)or 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。