Ist es möglich, den Anruf zu einer Modul-Funktion von innerhalb einer Klasse, ist auch in diesem Modul
In diesem Ruby-code:
Module M
Class C < Struct.new(:param)
def work
M::helper(param)
end
end
def helper(param)
puts "hello #{param}"
end
end
Bekomme ich ein "undefined method 'Helfer' für 'M:Modul'" Fehler, wenn ich versuche zu laufen
c = M::C.new("world")
c.work
aber anrufen M::helper("world")
direkt von einer anderen Klasse funktioniert. Können Klassen, die nicht-Aufruf-Modul-Funktionen definiert sind, die im gleichen Modul sind Sie definiert? Gibt es eine Möglichkeit, um dieses andere als das verschieben der Klasse außerhalb des Moduls?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Reihenfolge zu berufen
M::helper
müssen Sie definieren es alsdef self.helper; end
Aus Gründen der Vergleich, werfen Sie einen Blick auf Helfer und helper2 in der folgenden geänderten snippet
sollten Sie voran, Modul-Methode mit
self
:C.work
ist genannt als Methode einer Klasse anstelle von Instanz-Methode. Haben Sie versucht, Sie anzurufenM.helper("foo")
?C
ist versucht zu rufenhelper
aufM
wennhelper
ist nicht inM
's singleton-Klasse. Auch, Sie sagen immer, dasshelper
ist ein-Modul-Funktion, wenn es ist nur eine Methode. Machenhelper
eine Modul-Funktion wird die code-Arbeit:Einschließlich das Modul in der Klasse wird auch die Arbeit:
Im ersten Beispiel
helper
ist inM
's singleton-Klasse mitmodule_function
. Das zweite Beispiel importiertM
's Methoden inC
so dassC
Sie verwenden können. Ein weiterer Unterschied ist, dass in der ersten, werden Sie in der Lage zu nennenM.helper
von überall in Ihrem code. In der zweiten, werden Sie in der Lage zu nennenhelper
aus einer beliebigen Instanz vonC
im code. Um dies zu beheben, stellen Siehelper
private:Hier einige Erklärungen:
Vom ruby-docs.
self.methodname
innerhalb eines Moduls schafft eine Modul-Methode.In diesem Fall, wenn Sie aufrufen
M::helper
Sie tatsächlich tunM.helper
wenn man es von einem C++ Entwickler-Sicht. Der receiver-Modul-Objekt (eine Instanz des ruby-builtin-Typ-Modul) in diesem Fall.Anderen Weg, um an dieser Suche ist, zu verstehen, eine Empfänger-Konzept, jede Methode nennen, besteht aus einem Empfänger und Methode name (+ Optional params und code-block). Empfänger kann eine
Module object
,Class object
oder Instanz einer benutzerdefinierten Klasse.Können Sie nur aufrufen-Modul (oder Klasse) - Methoden in einem Modul (oder Klasse) Objekt. Sie können rufen Sie Ihre Methode (Modul/Klasse/Instanz) auf eine Instanz.
Wenn Sie aufrufen möchten, eine Instanz-Methode in einem Modul definiert, dann müssen Sie ihm ein Empfänger von
including
dass das Modul in der Klasse und erstellen eine Instanz von Ihr.So, in diesem Fall eine andere Lösung kann sein: