Ich studiere für den Erwerb von Rubingold. Ich habe mein Verständnis von Super geändert und wollte es teilen.
Was für ein Ergebnis wird zunächst ausgegeben, wenn der folgende Code ausgeführt wird?
module M
def foo
super
puts "M#foo"
end
end
class C2
def foo
puts "C2#foo"
end
end
class C < C2
def foo
super
puts "C#foo"
end
include M
end
C.new.foo
Option 1
C2#foo C#foo
Option 2
C2#foo M#foo C#foo
Option 3
Fehler wird angezeigt
Ich dachte immer, es wäre 1. Die richtige Antwort lautet übrigens "Option 2" Wenn Sie es richtig verstehen und richtig beantworten, müssen Sie nicht mehr suchen. Vielen Dank für das bisherige Anschauen.
Wie habe ich zuerst Option 1 gewählt?
"C-Klasse-Foo-Methode, hmm hmm" "Oh, super? Du musst dir nur die Elternklasse ansehen." "Ich verstehe, die Antwort ist 1!"
Es ist so. Ich dachte, es würde nicht aufgerufen werden, wenn ich das Modul einbinde.
Lass uns etwas über die Superklasse lernen. Zunächst eine kurze Beschreibung von Super, beschrieben im Referenzhandbuch.
super ruft die Methode auf, die die aktuelle Methode überschreibt
Ich verstehe, es scheint keine Superklassenmethode aufzurufen. Verwenden wir nun die Ahnenmethode.
##Kürzung
class C < C2
def foo
super
puts "C#foo"
end
include M
self.ancestors #=> [C, M, C2, Object, Kernel, BasicObject]
end
C.new.foo
Vorfahren ist eine Methode, die auf einfache Weise die Suchreihenfolge von Methoden anzeigt. Wenn beispielsweise die foo-Methode ausgeführt wird, wird nach der C foo-Methode gesucht, und wenn nicht, wird nach der M foo-Methode gesucht.
Schauen wir uns nun den fraglichen Code noch einmal an.
module M
def foo
super #Siehe foo in C2
puts "M#foo"
end
end
class C2
def foo
puts "C2#foo"
end
end
class C < C2
def foo
super #Siehe Ms Foo
puts "C#foo"
end
include M
self.ancestors #=> [C, M, C2, Object, Kernel, BasicObject]
end
C.new.foo
#=> C2#foo
#=> M#foo
#=> C#foo
Wenn Sie für Qualifikationen studieren, werden Sie Ihr Verständnis vertiefen. Wenn Sie also wenig praktische Erfahrung haben, können Sie versuchen, zu studieren.
Recommended Posts