Zunächst einige Ähnlichkeiten, die noch nicht erwähnt wurden. Ruby unterstützt offene Klassen, aber auch offene Module. Schließlich erbt Class von Module in der Class-Vererbungskette, sodass Class und Module ein ähnliches Verhalten aufweisen.
Aber Sie müssen sich fragen, was der Zweck ist, sowohl eine Klasse als auch ein Modul in einer Programmiersprache zu haben? Eine Klasse soll eine Blaupause zum Erstellen von Instanzen sein, und jede Instanz ist eine realisierte Variation der Blaupause. Eine Instanz ist nur eine realisierte Variation einer Blaupause (der Klasse). Klassen fungieren dann natürlich als Objekterstellung. Da wir manchmal möchten, dass eine Blaupause von einer anderen Blaupause abgeleitet wird, sind Klassen so konzipiert, dass sie die Vererbung unterstützen.
Module können nicht instanziiert werden, erstellen keine Objekte und unterstützen keine Vererbung. Denken Sie also daran, dass ein Modul NICHT von einem anderen erbt!
Was bringt es dann, Module in einer Sprache zu haben? Eine offensichtliche Verwendung von Modulen besteht darin, einen Namespace zu erstellen, und Sie werden dies auch bei anderen Sprachen bemerken. Wiederum ist das Coole an Ruby, dass Module wieder geöffnet werden können (genau wie Klassen). Dies ist eine große Verwendung, wenn Sie einen Namespace in verschiedenen Ruby-Dateien wiederverwenden möchten:
module Apple
def a
puts 'a'
end
end
module Apple
def b
puts 'b'
end
end
class Fruit
include Apple
end
> f = Fruit.new
=> #<Fruit:0x007fe90c527c98>
> f.a
=> a
> f.b
=> b
Es gibt jedoch keine Vererbung zwischen Modulen:
module Apple
module Green
def green
puts 'green'
end
end
end
class Fruit
include Apple
end
> f = Fruit.new
=> #<Fruit:0x007fe90c462420>
> f.green
NoMethodError: undefined method `green' for #<Fruit:0x007fe90c462420>
Das Apple-Modul hat keine Methoden vom Green-Modul geerbt. Wenn wir Apple in die Fruit-Klasse aufgenommen haben, werden die Methoden des Apple-Moduls zur Ahnenkette der Apple-Instanzen hinzugefügt, nicht jedoch die Methoden des Green-Moduls, obwohl das Green-Modul Modul wurde im Apple-Modul definiert.
Wie erhalten wir Zugang zur grünen Methode? Sie müssen es explizit in Ihre Klasse aufnehmen:
class Fruit
include Apple::Green
end
=> Fruit
> f.green
=> green
Aber Ruby hat eine andere wichtige Verwendung für Module. Dies ist die Mixin-Funktion, die ich in einer anderen Antwort auf SO beschreibe. Zusammenfassend lässt sich sagen, dass Sie mit Mixins Methoden in die Vererbungskette von Objekten definieren können. Über Mixins können Sie Methoden zur Vererbungskette von Objektinstanzen (include) oder zur singleton_class von self (extens) hinzufügen.