Überschreibungsmethode durch eine andere im Modul definierte Methode
Möchte ich definieren eine Instanz-Methode Date#next
die gibt den nächsten Tag. Also machte ich einen DateExtension
Modul, so wie dieses:
module DateExtension
def next(symb=:day)
dt = DateTime.now
{:day => Date.new(dt.year, dt.month, dt.day + 1),
:week => Date.new(dt.year, dt.month, dt.day + 7),
:month => Date.new(dt.year, dt.month + 1, dt.day),
:year => Date.new(dt.year + 1, dt.month, dt.day)}[symb]
end
end
Mit:
class Date
include DateExtension
end
Aufruf der Methode d.next(:week)
macht Ruby wirft einen Fehler ArgumentError: wrong number of arguments (1 for 0)
.
Wie kann ich den Standardwert überschreiben next
Methode von Date
Klasse mit der man erklärte, im DateExtension
Modul?
InformationsquelleAutor der Frage resilva87 | 2011-05-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ruby 2.0 und höher können Sie
Module#prepend
:Ursprüngliche Antwort für ältere Ruby-Versionen ist unten.
Das problem mit
include
(wie gezeigt in das folgende Diagramm) ist, dass die Methoden einer Klasse können nicht überschrieben werden, indem Module, die in dieser Klasse (Lösungen Folgen Sie dem Diagramm):Lösungen
Unterklasse Datum nur für diese eine Methode:
Verlängern nur die Instanzen, die Sie brauchen, mit Ihrem eigenen Methode:
Wenn Ihr Modul, ausführen einer grob hacken und erreichen innerhalb der Klasse und zerstören das alte 'weiter so, dein wird genannt:
Diese Methode ist weit mehr invasiv als nur inklusive ein Modul, aber der einzige Weg (der die Techniken gezeigt bisher) so zu machen, dass neue Date-Instanzen zurückgegeben werden, die von system-Methoden werden automatisch verwenden Methoden aus der eigenen Modul.
Aber wenn du gehst zu tun, Sie könnte genauso gut überspringen Sie das Modul zusammen und gehen Sie gerade zu monkeypatch land:
Wenn Sie wirklich brauchen diese Funktion in Ihrer eigenen Umgebung, beachten Sie, dass die Voranstellen Bibliothek von banisterfiend können, geben Ihnen die Möglichkeit, Ursache-lookup auftreten, in einem Modul vor der Klasse, in die es gemischt wird.
Module#prepend
sieht kommen in Ruby 2.0.InformationsquelleAutor der Antwort Phrogz
Den
next
Methode fürDate
definiert wird, in derDate
Klasse und Methoden in einer Klasse definiert, Vorrang vor denen definiert in einem Modul enthalten. Also, wenn Sie dies tun:Sind Sie ziehen in Ihrer version von
next
aber dienext
definiert inDate
immer noch Vorrang. Sie müssen Ihrenext
rechts inDate
:Aus der die Programmierung Ruby Kapitel Klassen und Objekte:
InformationsquelleAutor der Antwort mu is too short