485 Stimmen

Was ist der Unterschied zwischen include und extend in Ruby?

Ich mache mich gerade mit der Ruby-Metaprogrammierung vertraut. Die Mixin/Module schaffen es immer, mich zu verwirren.

  • einschließen. : mischt sich in angegebene Modulmethoden als Beispielmethoden in der Zielklasse
  • erweitern. : mischt sich in angegebene Modulmethoden als Klassenmethoden in der Zielklasse

Liegt der Hauptunterschied also nur darin oder lauert ein größerer Drache? z.B..

module ReusableModule
  def module_method
    puts "Module Method: Hi there!"
  end
end

class ClassThatIncludes
  include ReusableModule
end
class ClassThatExtends
  extend ReusableModule
end

puts "Include"
ClassThatIncludes.new.module_method       # "Module Method: Hi there!"
puts "Extend"
ClassThatExtends.module_method            # "Module Method: Hi there!"

3voto

user1136228 Punkte 917

Ich möchte auch den Mechanismus erklären, wie er funktioniert. Wenn ich nicht richtig bin, korrigieren Sie mich bitte.

Wenn wir die include wir fügen eine Verknüpfung von unserer Klasse zu einem Modul hinzu, das einige Methoden enthält.

class A
include MyMOd
end

a = A.new
a.some_method

Objekte haben keine Methoden, nur Clases und Module haben welche. Wenn also a empfängt Nachricht some_method es beginnt die Suchmethode some_method en a Eigenklasse, dann in A Klasse und dann in verknüpft mit A Klassenmodule, wenn es welche gibt (in umgekehrter Reihenfolge, der zuletzt aufgenommene gewinnt).

Wenn wir die extend wir fügen eine Verknüpfung zu einem Modul in der Eigenklasse des Objekts hinzu. Wenn wir also A.new.extend(MyMod) verwenden, fügen wir eine Verknüpfung zu unserem Modul in der Instanz-Eigenklasse von A hinzu oder a' Klasse. Und wenn wir A.extend(MyMod) verwenden, fügen wir eine Verknüpfung zu A(object's, classes are also objects) eigenclass A' .

so dass die Methode lookup path für a ist wie folgt: a => a' => verknüpfte Module zur Klasse a' => A.

Außerdem gibt es eine prepend-Methode, die den Suchpfad ändert:

a => a' => vorangestelltes Modul zu A => A => eingebundenes Modul zu A

Entschuldigung für mein schlechtes Englisch.

3voto

Abdullah Numan Punkte 129

Ich bin auf eine sehr nützliche Artikel die vergleicht include , extend y prepend eingesetzte Methoden innerhalb einer Klasse :

include fügt Modulmethoden als Instanzmethoden zur Klasse hinzu, während extend fügt Modulmethoden als Klassenmethoden hinzu. Das einzubindende oder zu erweiternde Modul muss entsprechend definiert werden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X