Вы можете использовать метод Метод # super_method , который обеспечивает большую гибкость.
module M1
def meth(arg)
yield arg
end
end
module M2
def meth(arg)
yield arg
end
end
class C
include M1
include M2
def meth(arg)
yield arg
end
def test(cond, &block)
case cond
when :C
meth(cond, &block)
when :M2
method(:meth).super_method.call(cond, &block)
when :M1
(method(:meth).super_method).super_method.call(cond, &block)
end
end
end
C.ancestors
#=> [C, M2, M1, Object, Kernel, BasicObject]
c = C.new
c.test(:C) { |m| "meth is from #{m}" }
#=> "meth is from C"
c.test(:M2) { |m| "meth is from #{m}" }
#=> "meth is from M2"
c.test(:M1) { |m| "meth is from #{m}" }
#=> "meth is from M1"
Если по какой-то причине вы хотели использовать prepend
вместо include
, C.ancesors
будет выглядеть следующим образом:
class C
prepend M1
prepend M2
end
C.ancestors
#=> [M2, M1, C, Object, Kernel, BasicObject]
, поэтому вы просто измените test
соответственно.