Wenn Klassen die Singleton-Klassen werden auch geerbt in Ruby vererbt werden:Warum schließt die Einfügung von Ruby-Modulen die Singleton-Klasse des Moduls aus?
class A
def self.hello
puts "hello"
end
end
class B < A
end
B.hello #=> "hello"
Doch mit Modulen, ist dies nicht der Fall:
module M
def self.goodbye
puts "goodbye"
end
end
class A
include M
end
A.goodbye #=> NameError
auf diesen hässlichen viele ppl zurückgreifen, um diese Einschränkung zu erhalten Hack:
module M
def self.included(c)
c.extend ClassMethods
end
module ClassMethods
def goodbye
puts "goodbye"
end
end
end
Ok, so meine Frage: gibt es einen theoretischen/konzeptionellen Grund für diese Beschränkung auf Module? oder war es nur eine Umsetzungsschwierigkeit?
Nach dem Blick auf den C-Quellcode (YARV/MRI) kann ich identifizieren, gibt es eine Implementierung Schwierigkeit (nicht unüberwindbar, aber eine egal), aber ist das der einzige Grund? Gibt es andere Gründe für diese Einschränkung?
danke
Warum sollten sie auch? Das Einbinden eines Moduls ist nicht das Gleiche wie das Erben einer Klasse. –
@Mladen, ich kaufe das nicht. Wenn die begriffliche Unterscheidung so klar war, warum versuchen dann Leute (selbst sehr Top-Ruby-Programmierer), diese Einschränkung zu umgehen, indem sie den 'ClassMethods'-Hack benutzen? Weiter - warum ist es so unbedacht, dass irgendwie die Natur des Moduls diese besondere Einschränkung mit sich bringt? – horseyguy
IMHO, Modul Mixins! = Mehrfachvererbung, also was auch immer einige Leute tun könnten, beweist wirklich nichts. BTW, können Sie die Notwendigkeit für den Hack durch ein reales Beispiel illustrieren, wo man zum Beispiel nicht dasselbe erreichen könnte, indem man das Modul 'A' und das Modul' B' mit einbezieht? –