Я хочу добавить метод foo
в модуль ядра Ruby, чтобы я мог написать foo(obj)
в любом месте и заставить его что-то сделать для obj
. Иногда я хочу, чтобы класс переопределил foo
, поэтому я делаю это:
module Kernel
private # important; this is what Ruby does for commands like 'puts', etc.
def foo x
if x.respond_to? :foo
x.foo # use overwritten method.
else
# do something to x.
end
end
end
это хорошо и работает. но что, если я хочу использовать значение по умолчанию Kernel::foo
в каком-либо другом объекте, который перезаписывает foo
? Поскольку у меня есть метод экземпляра foo
, я потерял исходную привязку к Kernel::foo
.
class Bar
def foo # override behaviour of Kernel::foo for Bar objects.
foo(3) # calls Bar::foo, not the desired call of Kernel::foo.
Kernel::foo(3) # can't call Kernel::foo because it's private.
# question: how do I call Kernel::foo on 3?
end
end
Есть ли какой-нибудь чистый способ обойти это? Я бы предпочел, чтобы у меня не было двух разных имен, и я определенно не хочу делать Kernel::foo
публичным.