Frage

Ich komme aus Java und arbeite jetzt mehr mit Ruby.

Eine Sprachfunktion, mit der ich nicht vertraut bin, ist die module.Ich frage mich, was genau ein ist module und wann verwenden Sie eins und warum verwenden Sie ein module über ein class?

War es hilfreich?

Lösung

Die erste Antwort ist gut und gibt einige strukturelle Antworten, aber ein anderer Ansatz ist, um darüber nachzudenken, was du tust. Die Module sind über die Methoden bereitstellt, die Sie über mehrere Klassen verwenden können - man denke über sie als „Bibliotheken“ (wie Sie in einer Rails-Anwendung sehen würde). Die Klassen sind zu Objekten; Module sind über Funktionen.

Zum Beispiel Authentifizierungs- und Autorisierungssysteme sind gute Beispiele für Module. Authentifizierungssysteme arbeiten über mehrere App-Level-Klassen (Benutzer authentifiziert werden, Sitzungen verwalten Authentifizierung, werden viele andere Klassen anders handeln auf der Grundlage der Auth-Zustand), so Authentifizierungssysteme fungieren als gemeinsame APIs.

Sie können auch ein Modul verwenden, wenn Sie Methoden über mehrere Anwendungen freigegeben haben (auch hier ist die Bibliothek Modell hier gut).

Andere Tipps

╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║               ║ class                     ║ module                          ║
╠═══════════════╬═══════════════════════════╬═════════════════════════════════╣
║ instantiation ║ can be instantiated       ║ can *not* be instantiated       ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ usage         ║ object creation           ║ mixin facility. provide         ║
║               ║                           ║   a namespace.                  ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ superclass    ║ module                    ║ object                          ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ methods       ║ class methods and         ║ module methods and              ║
║               ║   instance methods        ║   instance methods              ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inheritance   ║ inherits behaviour and can║ No inheritance                  ║
║               ║   be base for inheritance ║                                 ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inclusion     ║ cannot be included        ║ can be included in classes and  ║
║               ║                           ║   modules by using the include  ║
║               ║                           ║   command (includes all         ║
║               ║                           ║   instance methods as instance  ║
║               ║                           ║   methods in a class/module)    ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ extension     ║ can not extend with       ║ module can extend instance by   ║
║               ║   extend command          ║   using extend command (extends ║
║               ║   (only with inheritance) ║   given instance with singleton ║
║               ║                           ║   methods from module)          ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝

Ich bin überrascht, jemand dies noch nicht gesagt hat.

Da die Fragesteller von einem Java-Hintergrund kam (und so habe ich), hier ist eine Analogie, das hilft.

Die Klassen sind einfach wie Java-Klassen.

Module sind wie Java statische Klassen. Denken Sie über Math Klasse in Java. Sie instanziiert es nicht, und Sie wieder verwenden die Methoden in der statischen Klasse (zB. Math.random()).

Grundsätzlich kann das Modul nicht instanziert werden. Wenn eine Klasse ein Modul enthält, wird ein Proxy übergeordnete Klasse erzeugt, dass alle Zugriff auf den Modul-Methoden sowie die Klassenmethoden zur Verfügung stellt.

Ein Modul kann von mehreren Klassen enthalten sein. Die Module können nicht vererbt werden, aber dieses „mixin“ -Modell bietet eine nützliche Art von „multiple inheritrance“. OO Puristen werden mit dieser Aussage nicht einverstanden ist, aber nicht Reinheit in der Quere kommen lassen von dem Job getan.


(Diese Antwort ursprünglich im Zusammenhang mit http://www.rubycentral.com/pickaxe/classes.html, aber das Link und seine Domäne ist nicht mehr aktiv.)

Module in Ruby, zu einem gewissen Grad, entspricht Java abstrakte Klasse - Instanz-Methoden, können Klassen von ihm erben (via include Ruby Jungs nennen es eine "mixin"), sondern hat keine Instanzen. Es gibt noch andere kleinere Unterschiede, aber so viel Information ist genug, um Ihnen den Start.

Namespace: Module sind Namespaces ..., die in Java nicht existieren;)

Ich wechselte auch von Java und Python Ruby, ich erinnere mich hatte genau dieselbe Frage ...

So ist die einfachste Antwort ist, dass Modul ein Namespace ist, die nicht in Java vorhanden ist. In Java-Namensraum in der Nähe mindset ist ein Paket .

So ein Modul in Ruby ist wie das, was in Java:
Klasse? Nein
Schnittstelle? Nein
abstrakte Klasse? Nein
Paket? Ja (vielleicht)

statische Methoden innerhalb von Klassen in Java: wie Methoden innerhalb von Modulen in Ruby

In Java die kleinste Einheit eine Klasse ist, können Sie nicht eine Funktion außerhalb einer Klasse haben. Jedoch in rubin dies möglich ist (wie Python).

Also, was geht in ein Modul?
Klassen, Methoden, Konstanten. Modul schützt sie unter diesem Namensraum.

Nein Beispiel: Module nicht verwendet werden kann Instanzen erstellen

Mixed in: manchmal Vererbung Modelle für die Klassen nicht gut sind, aber in Bezug auf Funktionalität wollen eine Reihe von Klassen / Methoden / Konstanten zu gruppieren

Regeln über Module in Ruby:
- Modulnamen sind
Uppercamelcase - Konstanten innerhalb von Modulen sind alle CAPS (diese Regel ist das gleiche für alle Ruby-Konstanten, auf die Module nicht spezifisch)
- Zugriffsmethoden: Verwendung. Betreiber
- Zugriffskonstanten: Verwendung :: Symbol

einfaches Beispiel eines Moduls:

module MySampleModule
  CONST1 = "some constant"

  def self.method_one(arg1)
    arg1 + 2
  end
end

, wie Methoden verwenden, innerhalb eines Moduls:

puts MySampleModule.method_one(1) # prints: 3

Wie die Konstanten eines Moduls verwenden:

puts MySampleModule::CONST1 # prints: some constant

Einige andere Konventionen über Module:
Verwenden Sie ein Modul in einer Datei (wie Ruby Klassen, eine Klasse pro Rubin-Datei)

Endeffekt:Ein Modul ist eine Kreuzung zwischen einer statischen/Dienstprogrammklasse und einem Mixin.

Mixins sind wiederverwendbare Teile einer „partiellen“ Implementierung, die im Mix & Match-Stil kombiniert (oder zusammengestellt) werden können, um beim Schreiben neuer Klassen zu helfen.Natürlich können diese Klassen zusätzlich einen eigenen Status und/oder Code haben.

Klasse

Wenn Sie eine Klasse definieren, definieren Sie einen Entwurf für einen Datentyp.  Klasse halte Daten, haben Verfahren, das mit diesen Daten interagieren und werden verwendet, um Objekte zu instanziieren.

Modul

  • Module ist eine Art und Weise zu gruppieren Methoden, Klassen und Konstanten.

  • Module geben Ihnen zwei große Vorteile:

    => Module bieten einen Namespace und Namenskonflikte zu vermeiden. Namespace Hilfe vermeiden Konflikte mit Funktionen und Klassen mit dem gleichen Namen, die von jemandem anderen geschrieben wurde.

    => Module die mixin Anlage implementieren.

  

(einschließlich Module in Klazz gibt Instanzen von Klazz Zugriff auf Modul   Methoden. )

     

(extend Klazz mit Mod die Klasse Klazz Zugriff auf Mods Methoden zu geben.)

Zunächst einige Ähnlichkeiten, die noch nicht erwähnt worden sind. Ruby unterstützt offene Klassen, sondern Module als zu offen. Immerhin Klasse erbt von Modul in der Klassenvererbungskette und so Klasse und Module haben ein ähnliches Verhalten haben.

Aber Sie müssen sich fragen, was der Zweck ist sowohl eine Klasse und ein Modul in einer Programmiersprache? Eine Klasse ist beabsichtigt, ein Entwurf für die Erstellung von Instanzen zu sein, und jede Instanz eine realisierte Variation des Bauplans. Eine Instanz ist nur eine realisierte Variante eines Plans (die Klasse). Natürlich dann funktionieren Klassen als Objekterstellung. Darüber hinaus, da wir manchmal einen Entwurf von einem anderen Plan ableiten wollen, sind Klassen entworfen Erbe zu unterstützen.

Die Module können nicht instanziiert werden, erstellen Sie keine Objekte, und nicht Vererbung unterstützen. Also denken Sie daran ein Modul nicht von einem anderen erben!

So was ist dann der Punkt der Module in einer Sprache zu haben? Eine offensichtliche Verwendung von Modulen ist ein Namespace zu erstellen, und Sie werden bemerken dies mit anderen Sprachen auch. Wieder was zu Ruby cool ist, dass Module (wie Klassen) wieder geöffnet werden kann. Und das ist eine große Auslastung, wenn Sie einen Namespace in verschiedenen Ruby-Dateien wiederverwenden mögen:

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

Aber es gibt keine Vererbung zwischen den 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>

Die Apple-Modul hat erbt keine Methoden aus dem Grün-Modul und wenn wir Apple in der Fruit Klasse enthalten ist, werden die Methoden der Apple-Modul an die Vorläuferkette von Apple Instanzen hinzugefügt, aber keine Methoden des Grün Modul, auch obwohl das Grün-Modul in dem Apple-Modul definiert wurde.

So wie gewinnen wir Zugriff auf die grüne Methode? Sie haben zu schließen explizit in Ihrer Klasse:

class Fruit
  include Apple::Green
end
 => Fruit 
 > f.green
=> green

Aber Ruby hat eine weitere wichtige Verwendung für die Module. Dies ist die Mixin Anlage, die ich auf SO in einer anderen Antwort zu beschreiben. Aber zusammenzufassen, Mixins können Sie Methoden in der Vererbungskette von Objekten definieren. Durch Mixins, können Sie Methoden, um die Vererbungskette von Objektinstanzen hinzufügen (enthalten) oder den singleton_class Selbst (erstrecken).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top