Во-первых, нет, не будет. Я не хочу, чтобы ruby просто сказал: «Эй, может быть, это строковый метод, давайте посмотрим, смогу ли я запустить его после запуска to_s
» на произвольном объекте. При этом есть два решения для того, что вы хотите сделать:
Если вы хотите сказать «В любом экземпляре Author
, если кто-то вызывает метод, которого у него нет, но который String
делает, тогда он должен волшебным образом вызвать to_s
», тогда сделайте следующее:
class Author < ActiveRecord::Base
def to_s
name
end
def method_missing(s, *a)
x = to_s
if x.respond_to? s then
return x.send(s, *a)
else
super
end
end
end
Если вы хотите сказать «rjust
на что-либо, что не является строкой, значит сначала вызвать to_s
», затем:
class Object
def rjust(*a)
to_s.rjust(*a)
end
end
(Повторите с другими методами по желанию; обратите внимание, что это позволяет вам делать такие вещи, как 86.rjust(10)
; хорошо это или нет, может быть вопросом вкуса)