Вот обходной путь. Вы можете повторно открыть модуль, сделать несвязанную ссылку на исходный метод экземпляра, а затем переопределить его, чтобы вызвать оригинальный метод (с некоторым измененным поведением).
Во-первых, оригинальное определение:
module Foo
def bar(arg)
"self=#{self}, arg=#{arg}"
end
module_function :bar
end
Далее, повторное открытие и переопределение метода:
module Foo
OrigBarMethod = instance_method(:bar)
def bar(arg)
Foo::OrigBarMethod.bind(self).call(arg + 1)
end
module_function :bar
end
puts Foo.bar(1) # => "self=Foo, arg=2"
Я использую bind(self)
, чтобы исходный метод все еще мог использовать self
, например:
class MyClass
include Foo
end
MyClass.new.send(:bar, 1) # => "self=#<MyClass:0x00007fb66a86cbf8>, arg=2"