Это работает в Rails:
my_object.try(:name).try(:capitalize)
Если вы хотите, чтобы он работал в Ruby, вы должны расширить Object
следующим образом:
class Object
##
# @person ? @person.name : nil
# vs
# @person.try(:name)
def try(method)
send method if respond_to? method
end
end
Источник
В Rails это реализовано так:
class Object
def try(*a, &b)
if a.empty? && block_given?
yield self
else
__send__(*a, &b)
end
end
end
class NilClass
def try(*args)
nil
end
end