Grob gesehen ist ein Modul nichts weiter als ein Behälter für Konstanten, Klassen, Methoden usw. Wenn man jedoch etwas in die Feinheiten geht, erkennt man folgendes:
Class alias Module: NamespacesZwar lässt sich theoretisch jede Klasse als Modul verwenden, praktisch wird das aber nie getan. Es gilt als unsauberer Stil. Eine solche Konstruktion würde nur für Verwirrung sorgen:
Für Container aller Art werden Module benutzt. Das obige Beispiel sähe so sinnvoller aus:
Es stimmt nicht ganz mit dem oberen Code überein, weil das Modul C aus der Klasse B entfernt wurde - dort gehört es nicht hin. Wie man ja bereits am Code gesehen hat, ist die Zugriffssyntax für alles, was im Modul ist, der Geltungsbereichoperator
Es ist auch möglich, Modulmethoden auf diese Art und Weise abzurufen, aber das ist kein guter Stil und wird als unelegant angesehen. Stattdessen sollte man auf die Syntax für Klassenmethoden zurückgreifen - schliesslich werden Modulmethoden genauso wie Klassenmethoden definiert:
module AdvancedFunctions
def self.function1
puts "1"
return 1
end
end
module AdvancedFunctions
class << AdvancedFunctions
def function1
puts "2"
return 2
end
end
end
Wenn ein Programm beide Libs einbindet, kommt es zum Konflikt, weil lib2 die Methode aus lib1 überschreibt:
Also eindeutige Namen verwenden! MixinsZusätzlich kann man Module als Mixins verwenden. Schon einmal probiert, was passiert, wenn man in einem Modul eine Methode so definiert?
Antwort: Gar nichts. Man kann die Methode nicht aufrufen. Warum ist das so? Ganz einfach: Dieses Modul wird als Mixin behandelt, dass seine Methoden einer Klasse zur Verfügung stellen kann:
Der Hauptartikel zu Mixins befindet sich im Artikel Vererbung, da mit Mixins häufig Mehrfachvererbung simuliert wird. |
||||||||||||||||||||||||||||