Ich habe ein paar Artikel über Ruby Mixin Methoden, extend
und include
gelesen, und ich bin immer noch nicht ganz sicher über das Verhalten. Ich verstehe, dass extend
die Instanzmethoden des gegebenen Moduls als Singleton-Methoden zu dem Modul hinzufügen, das die Erweiterung durchführt, und dass include
im Wesentlichen den Inhalt eines Moduls (Methoden, Konstanten, Variablen) demjenigen anfügen wird, der das Includeing durchführt, effektiv definiert sie im Empfänger.Ruby Mixins: erweitern und enthalten
Aber nach ein wenig Basteln, versuchen, ein Gefühl dafür zu bekommen, wie sich das Verhalten manifestieren wird, habe ich ein paar Fragen. Hier ist mein Test-Setup:
module Baz
def blorg
puts 'blorg'
end
end
module Bar
include Baz
def blah
puts 'blah'
end
end
module Foo
extend Bar
end
class Bacon
extend Bar
end
class Egg
include Bar
end
So wie ich erwarten würde, Modul Bar
gewinnt die Instanzmethoden definiert in Baz
(#blorg
), als ob sie in sich selbst definiert worden war aufgrund der Einbeziehung Methode und Klasse Bacon
Gewinne die Singleton-Methoden Bacon::blah
und Bacon::blorg
durch Erweiterung.
Bacon.blah # => blah
Bacon.blorg # => blorg
und Klasse Egg
gewinnt die definierten Methoden in Bar
(#blah
und jetzt #blorg
) als Instanzmethoden.
Egg.new.blah # => blah
Egg.new.blorg # => blorg
Ich bekomme alles, also ist das gut.
Allerdings verstehe ich nicht die Antworten, die ich von den Methoden #ancestors
und #is_a?
erhalten.
Bacon.ancestors # => [Bacon, Object, Kernel, BasicObject]
Bacon.is_a? Bar # => true
Egg.ancestors # => [Egg, Bar, Baz, Object, Kernel, BasicObject]
Egg.is_a? Bar # => false
Es scheint, dass ein Modul zur Verlängerung des #is_a?
Methode verursacht true
zurückzukehren, wenn über das Modul abgefragt, aber es ist nicht auf die Vorfahren der Klasse, und umgekehrt in Bezug auf die Aufnahme nicht hinzugefügt: die Vorfahren Die Klasse enthält die Module, die enthalten sind, aber die Methode #is_a?
gibt false
zurück, wenn sie abgefragt wird. Warum passiert das?
+1 für das großartige Format dieser Frage. – sargas