Ich habe ein Modul mit Methoden, die in ein Protokoll schreiben. In jede Nachricht möchte ich den Namen der Klasse eintragen, die diese Nachricht protokolliert hat. Das Modul kann unter Verwendung von include
oder extend
gemischt werden. Ich brauche mein Protokoll, um in jedem Fall korrekte Klassennamen zu haben.self.class.name in einem Mix-in-Modul
Destilliertes Code:
module M
def f
self.class.name
end
end
class C
extend M
include M
end
p C.f # => "Class"
p C.new.f # => "C"
Wie Sie der erste Aufruf zu sehen, druckt falsch "Class"
. Ich möchte, dass es auch "C"
ist.
Wie wird das erreicht?
Dies funktioniert allerdings nicht, wenn Sie 'M' verlängern, though. –
Sie müssen nicht erweitern. Die Methoden, die Sie in Klassenmethoden umwandeln möchten, die Sie in das ClassMethods-Modul einfügen. :) – Kaeros
Was ist, wenn ich nur erweitern und nicht einschließen möchte? Dann muss ich 'M: ClassMethods' aus gutem Grund verlängern. Persönlich mag ich das ganze Ausdehnungs-Einschluss-Muster auch nicht wirklich. –