То есть вы хотите что-то похожее на x = obj.method || default
? Ruby - это идеальный язык для построения собственных восходящих конструкций:
class Object
def try_method(name, *args, &block)
self.respond_to?(name) ? self.send(name, *args, &block) : nil
end
end
p "Hello".try_method(:downcase) || "default" # "hello"
p "hello".try_method(:not_existing) || "default" # "default"
Может быть, вам не нравится этот косвенный вызов с символами? нет проблем, тогда посмотрите на стиль Ick * maybe
и используйте прокси-объект (вы можете выяснить реализацию):
p "hello".maybe_has_method.not_existing || "default" # "default"
Примечание: я не эксперт по ООП, но, насколько я понимаю, вы должны заранее знать, имеет ли объект, который вы вызываете, такой метод. Или nil
объект, которым вы хотите управлять, чтобы не отправлять методы? В этом случае Ick уже хорошее решение: object_or_nil.maybe.method || default