Ruby Modul

Ein Modul ist eine Möglichkeit, Methoden, Klassen und Konstanten zusammenzufassen. Module bieten Ihnen zwei wesentliche Vorteile.

  • Module bieten einenNamensraumund vermeiden Namenskonflikte.
  • Module implementieren einenMixinMechanismus.

Ein Modul definiert einen Namensraum, der wie eine Sandbox wirkt, in dem Ihre Methoden und Konstanten nicht mit denen anderswo in Konflikt geraten.

Module ähneln Klassen, weisen jedoch die folgenden Unterschiede auf:

  • Module können nicht instanziiert werden
  • Module haben keine Unterklassen
  • Module können nur von einem anderen Modul definiert werden

Syntax

module Identifier statement1 statement2 ........... end

Modulkonstanten werden wie Klassenkonstanten benannt und beginnen mit einem Großbuchstaben. Methodendefinitionen sehen ebenfalls ähnlich aus: Modulmethodendefinitionen ähneln Klassenmethodendefinitionen.

Wie bei Klassenmethoden können Sie eine Modulmethode aufrufen, indem Sie den Modulnamen und einen Punkt vor den Methodennamen setzen, und Sie können auf eine Konstante verweisen, indem Sie den Modulnamen und zwei Doppelpunkte verwenden.

Beispiel

#!/usr/bin/ruby #Modul in der Datei trig.rb definiert module Trig PI = 3.141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. end end

Wir können mehrere Module mit denselben Funktionsnamen, aber unterschiedlicher Funktionalität definieren:

Beispiel

#!/usr/bin/ruby #Modul in der Datei moral.rb definiert module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... end end

Genau wie Klassenmethoden können Sie, wenn Sie eine Methode in einem Modul definieren, den Modulnamen gefolgt von einem Punkt und dann den Methodennamen angeben.

Ruby require-Anweisung

Die require-Anweisung ähnelt der include-Anweisung in C und C++ und der import-Anweisung in Java. Wenn ein Programm eines Drittanbieters ein beliebiges definiertes Modul verwenden möchte, kann es einfach die Rubyrequire-Anweisung verwenden, um die Moduldatei zu laden:

Syntax

Syntax

require filename

Hier ist die Dateiendung.rbnicht erforderlich.

Beispiel

$LOAD_PATH << '.' require 'trig.rb' require 'moral' y = Trig.sin(Trig::PI/4) wrongdoing = Moral.sin(Moral::VERY_BAD)

Hier verwenden wir$LOAD_PATH << '.', damit Ruby weiß, dass es das aktuelle Verzeichnis nach der referenzierten Datei durchsuchen muss. Wenn Sie $LOAD_PATH nicht verwenden möchten, können Sierequire_relativeverwenden, um auf eine Datei aus einem relativen Verzeichnis zu verweisen.

Hinweis:Hier enthalten die Dateien dieselben Funktionsnamen. Das würde also zu Mehrdeutigkeit im Code führen, wenn auf das aufrufende Programm verwiesen wird, aber Module vermeiden diese Mehrdeutigkeit, und wir können den Modulnamen verwenden, um die entsprechende Funktion aufzurufen.

Ruby include-Anweisung

Sie können Module in eine Klasse einbetten. Um ein Modul in eine Klasse einzubetten, können Sie dieinclude-Anweisung verwenden:

Syntax

include modulename

Wenn das Modul in einer separaten Datei definiert ist, müssen Sie dierequire-Anweisung verwenden, um auf die Datei zu verweisen, bevor Sie das Modul einbetten.

Beispiel

Angenommen, das folgende Modul ist in dersupport.rb-Datei geschrieben.

module Week FIRST_DAY = "Sunday" def Week.weeks_in_month puts "Sie haben vier Wochen in einem Monat" end def Week.weeks_in_year puts "Sie haben 52 Wochen in einem Jahr" end end

Jetzt können Sie das Modul in einer Klasse wie folgt referenzieren:

Beispiel

#!/usr/bin/ruby $LOAD_PATH << '.' require "support" class Decade include Week no_of_yrs=10 def no_of_months puts Week::FIRST_DAY number=10*12 puts number end end d1=Decade.new puts Week::FIRST_DAY Week.weeks_in_month Week.weeks_in_year d1.no_of_months

Dies erzeugt das folgende Ergebnis:

Sunday
You have four weeks in a month
You have 52 weeks in a year
Sunday
120

Mixins in Ruby

Bevor Sie diesen Abschnitt lesen, benötigen Sie ein grundlegendes Verständnis objektorientierter Konzepte.

Wenn eine Klasse Merkmale von mehr als einer Elternklasse erben kann, spricht man davon, dass die Klasse Mehrfachvererbung aufweist.

Ruby unterstützt Mehrfachvererbung nicht direkt, aber Rubys Module besitzen eine weitere magische Funktion. Sie macht die Notwendigkeit von Mehrfachvererbung nahezu überflüssig und bietet einenMixin-Mechanismus.

Ruby implementiert Mehrfachvererbung nicht tatsächlich, sondern übernimmt stattdessen eine als Mixin bezeichnete Technik als Ersatz. Wenn ein Modul in eine Klassendefinition eingebunden wird, werden die Methoden des Moduls in die Klasse eingemischt.

Schauen wir uns den folgenden Beispielcode an, um mehr über Mixin zu erfahren:

Beispiel

module A def a1 end def a2 end end module B def b1 end def b2 end end class Sample include A include B def s1 end end samp=Sample.new samp.a1 samp.a2 samp.b1 samp.b2 samp.s1
  • Modul A besteht aus den Methoden a1 und a2.
  • Modul B besteht aus den Methoden b1 und b2.
  • Die Klasse Sample enthält die Module A und B.
  • Die Klasse Sample kann auf alle vier Methoden zugreifen, nämlich a1, a2, b1 und b2.
  • Daher können Sie sehen, dass die Klasse Sample von zwei Modulen erbt. Man kann sagen, dass die Klasse Sample Mehrfachvererbung verwendet oder Mixin 。

andere Erweiterungen.