von den fine manual:
undef_method (Symbol) → Selbst
Verhindert, dass die aktuelle Klasse von Anrufen auf das genannte Verfahren reagiert. Vergleichen Sie dies mit remove_method
, die die Methode aus der bestimmten Klasse löscht; Ruby sucht immer noch Superklassen und gemischte Module für einen möglichen Empfänger.
So ein remove_method
wie folgt aus:
class CC < C
remove_method :m
end
ist im Wesentlichen das Gegenteil davon:
class CC < C
def m
end
end
Wo def m
die Methode m
der Klasse fügt hinzu: remove_method :m
entfernt m
. Aber wenn die Superklasse eine m
Methode hat, wird diese immer noch verwendet.
undef_method
, OTOH, ist wie folgt:
class CC < C
def m
raise 'No, you cannot do that.'
end
end
So undef_method
die Methode tatsächlich nicht entfernen, das Verfahren mit einer speziellen internen Flagge ersetzt, die Ruby führt zu beschweren, wenn Sie anrufen versuchen, dass Methode.
Klingt wie Sie versuchen, eine vorhandene Methode zu ersetzen und ersetzen ist semantisch das gleiche wie einentfernen, gefolgt von einem hinzufügen so remove_method
wahrscheinlich besser geeignet. Wenn Sie jedoch paranoid sein und sicherstellen möchten, dass die Ersatzmethode vorhanden ist, dann wäre undef_method
nützlich; oder, wenn Sie aus irgendeinem Grund die Methode an einem Ort entfernen und in einem anderen hinzufügen müssen, würde undef_method
Ihnen zumindest sagen, dass Sie nur die Hälfte der Arbeit getan haben, während remove_method
Sie entweder mit der Implementierung der Superklasse verlassen würde (und möglicherweise seltsamen Bugs) oder eher verwirrend NoMethodError
.
Ehrfürchtig Erklärungen. –