Методы, определенные в Lab
, имеют непосредственное преимущество перед методами, определенными в модулях, таких как M
, которые расширяются Lab
.
Таким образом, foo
, определенный непосредственно в Lab
, имеет приоритет над M#foo
, хотя Lab.extend M
.
Чтобы получить то, что вы хотите, сделайте следующее:
module Lab
module HasFoo
# foo isn't defined directly on Lab directly anymore;
# instead, it is defined in a separate module that
# Lab extends
def foo
puts "foo from lab"
end
end
extend HasFoo
end
module M
def foo
puts "foo from module"
super
end
end
module Lab
# when Lab extends another module with foo, that changes
# which concrete method the name foo gets resolved to
extend M
end
# now you should see the module foo and then the lab foo
Lab.foo