Драгоценный камень Facets обеспечивает элегантное решение (я думаю) этой проблемы.Он объединяет два этапа проверки, отвечает ли объект методу и фактически вызывает этот метод в один шаг.
Таким образом, ваш пример можно переписать так:
require 'facets/kernel/respond'
def value_format(v)
v.respond.to_actor || v.respond.to_subject || v.respond.to_json || v.respond.to_hash || v.respond.inspect
end
Обратите внимание, чтоэтот метод работает, только если можно с уверенностью предположить, что ни один из этих методов не вернет nil
или false
(поскольку respond
возвращает nil
, если объект не отвечает, это то, что позволяет нам связыватьвместе с кучей or
s).
Поскольку все перечисленные вами методы должны возвращать строки, я считаю, что этот подход будет работать в вашем примере.
Документация:
# Like #respond_to? but returns the result of the call
# if it does indeed respond.
#
# class RespondExample
# def f; "f"; end
# end
#
# x = RespondExample.new
# x.respond(:f) #=> "f"
# x.respond(:g) #=> nil
#
# or
#
# x.respond.f #=> "f"
# x.respond.g #=> nil