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
。