Посмотрите на obj.singleton_class.ancestors
, чтобы увидеть, что на самом деле происходит. По умолчанию это что-то вроде
[#<Class:#<Object:0x00007febcf103160>>, Object, Kernel, BasicObject]
Если вы сделаете obj.extend(mod)
, вы получите это:
[#<Class:#<Object:0x00007febcf103160>>, #<Module:0x00007febcd0bb088>, Object, Kernel, BasicObject]
Так что порядок плохой, потому что модуль отстаетСинглтон-класс. Чтобы заменить его, он должен быть раньше в цепочке предков. Вы можете сделать это по obj.singleton_class.prepend(mod)
. Цепочка предков в этом случае:
[#<Module:0x00007febcd0bb088>, #<Class:#<Object:0x00007febcf103160>>, Object, Kernel, BasicObject]
, и выходные данные показывают, что метод переопределен:
obj.foo
# => "module foo"