Nauka programowania: Jaka jest różnica między włączaniem i rozszerzaniem w Ruby?


Odpowiedź 1:
moduł Squeaky
  def piszczy
    „eep!”
  koniec
koniec

„Włącz” miksy w metodach instancji modułu do odbierającego modułu / klasy.

rzecz klasy
  to Squeaky
koniec

Thing.new.squeak
# => „eep!”

„Rozszerza” miksuje metody instancji modułu do obiektu odbierającego.

thing = Object.new
thing.extend Squeaky
pisk
# => „eep!”

Jeśli użyjesz metody „rozszerz” w kontekście klasy, wówczas metody instancji modułu staną się „metodami klasy”, ponieważ są one mieszane z klasą, a nie instancjami klasy.

klasa OtherThing
  przedłużyć Squeaky
koniec

OtherThing.squeak
# => „eep!”
OtherThing.new.squeak
# => NoMethodError (niezdefiniowana metoda `squeak ')