Префикс модуля Ruby и вывод

В чем разница между:

module Mod   
   def here
     puts 'child'
   end    
end

class A
  prepend Mod
  def here
    puts 'parent'
  end
end

и

class A
   def here
     puts 'parent'
   end
end

class B < A
  def here
    puts 'child'
  end
end

Или другой способ выразить это: выводит класс так же, как добавляет модуль дочернего кода?

Ответ 1

Нет, это не так. B может наследовать только один класс, но Mod может быть добавлен ко многим классам. Если вы должны были вызвать super внутри B#here, он всегда будет ссылаться на A#here, но внутри Mod#here он будет ссылаться на метод экземпляра #here любого класса Mod, который был добавлен к:

module Mod   
  def here
    super + ' Mod'
  end    
end

class A
  prepend Mod
  def here
    'A'
  end
end

class B
  prepend Mod
  def here
    'B'
  end
end

A.new.here
# => 'A Mod'

B.new.here
# => 'B Mod'

и

class A
  def here
    'A'
  end
end

class B
  def here
    'B'
  end
end

class C < A
  def here
    super + ' C'
  end
end

C.new.here
# => 'A C'

class C < B
  def here
    super + ' C'
  end
end
# TypeError: superclass mismatch for class C

Ответ 2

Нет, это совершенно другое.

Можно добавить столько модулей, сколько захочет.

module A
  def foo; "A" end
end

module B
  def foo; "B" end
end

class C
  prepend A, B   # Prepending is done by this line

  def foo; "C" end
end
### take a look at it!
C.ancestors # => [A, B, C, Object, Kernel, BasicObject]
C.new.foo # => "A"

Ruby реализует prepend и наследование разными способами. prepend внутренне достигается путем включения модулей, что вызывает удивительный ancestors.

здесь - это еще один вопрос о prepend, который может быть полезен.