2016-07-16 12 views
0

Was sind die Unterschiede zwischenWas sind die praktischen Unterschiede zwischen einer Modulmethode und einer Klassenmethode in Ruby?

module Logging 
    def self.log 
    if @logger.nil? 
     @logger = Logger.new STDOUT 
    end 
    @logger 
    end 
end 

und das?

class Logging 
    def self.log 
    if @logger.nil? 
     @logger = Logger.new STDOUT 
    end 
    @logger 
    end 
end 

Sie scheinen beide das Gleiche zu tun. Warum sollte ich eins über das andere wählen?

+1

Mögliches Duplikat von http://stackoverflow.com/questions/151505/difference-between-a-class-and-a-module –

Antwort

1

tl; dr: Es gibt keine Klassenmethoden und Modulmethoden in Ruby, nur Instanzmethoden. Wenn man bedenkt, dass sie beide nur Instanzmethoden sind und somit dasselbe, kann es keinen Unterschied geben.


In Ruby gibt es keine "Klassenmethode" oder "Modulmethode". Ruby hat genau eine Art von Methode: Instanzmethoden.

Wir verwenden manchmal das Wort „Klassenmethode“ oder „Modul-Methode“ aus Bequemlichkeit, wenn man über ein bestimmtes Muster von mit Instanzmethoden zu sprechen, aber es gibt kein solches Konzept in Ruby. "Klassenmethoden" und "Modulmethoden" sind wirklich nur Singleton-Methoden eines Objekts, das zufällig eine Instanz der Klasse Module oder Class ist. Es gibt absolut keinen Unterschied überhaupt zwischen einer Singleton-Methode eines Objekts, das eine Instanz von Class werden passiert, Module, String, Array, Hash, Object, Foo, Bar, Whatever oder Garbledigookidoo.

Oh. Habe ich erwähnt? Singleton-Methoden existieren ebenfalls nicht. Wieder ist es ein Wort, das wir für bestimmte Arten von Methoden verwenden, aber sie sind wirklich nur langweilig langweilig alte Instanz Methoden der Singleton Klasse eines Objekts.

jedoch „Instanzmethode der Singletonklasse von foo“ und „Instanzmethode der Singletonklasse von Foo, wo Foo ist eine Instanz Class“ sind wirklich lang, und so verkürzen wir sie „Singleton-Methode von foo "und" Klasse Methode Foo "aus Bequemlichkeit, zu wissen voller Brunnen, dass diese Fiktionen sind, die tatsächlich nicht in der Sprache existieren.

Im Gegensatz zu Java, das drei verschiedene Arten von Methoden hat (Instanzmethoden, statische Methoden und Konstruktoren (die quasi sortähnlich sind), hat Ruby genau eine Methode: Instanzmethoden. Keine Klassenmethoden, keine Modulmethoden, keine globalen Methoden, keine Top-Level-Methoden, keine statischen Methoden, keine Konstruktoren. Es hat jedoch, haben jedoch drei Arten von Klassen: reguläre Klassen, Singleton-Klassen und Include-Klassen (die letzteren Klassen werden synthetisiert und in die Vererbungshierarchie injiziert, wenn Sie include oder prepend aufrufen). Diese Klassen unterscheiden sich hauptsächlich darin, ob Methoden wie Object#class, Class#superclass und Class#ancestors diese anzeigen oder unterdrücken. Singleton-Klassen werden von allen unterdrückt, enthalten Klassen der ersten beiden, werden aber von ancestors angezeigt.

1

In Modulen geht es darum, Methoden zur Verfügung zu stellen, die Sie für mehrere Klassen verwenden können - denken Sie an sie als "Bibliotheken" (wie Sie es in einer Rails-App sehen würden). Klassen sind über Objekte; Module sind über Funktionen

Siehe this

+0

Ein Beispiel für ein Modul, das nur Modulmethoden enthält (keine Instanzmethoden zum Mischen) mit einer Klasse 'instance-Methoden durch 'include'-ing des Moduls ist Rubys [Math] (http://ruby-doc.org/core-2.3.0/Math.html) Modul. Modulmethoden werden manchmal als "Helfer" -Methoden bezeichnet. –

1

Module Klassen, in denen ähnlich sind sie eine Sammlung von Methoden, Konstanten und andere Modul und Klassendefinitionen halten. Im Gegensatz zu Klassen können Sie keine Objekte basierend auf Modulen erstellen.

Module dienen zwei Zwecken. Erstens fungieren sie als ein Namespace, in dem Sie Methoden definieren können, deren Namen nicht mit den an anderer Stelle definierten kollidieren. Zweitens erlauben sie Ihnen, Funktionalität zwischen Klassen zu teilen - wenn eine Klasse in einem Modul mischt, werden die Instanzmethoden dieses Moduls verfügbar, als wären sie in der Klasse definiert worden. Mehrere Klassen können im selben Modul kombiniert werden, wobei die Funktionalität des Moduls ohne Vererbung geteilt wird. Sie können auch mehrere Module in einer Klasse kombinieren.

Klassen sind zum Erstellen von Objekten.

+0

Es ist nicht notwendig für eine Klasse, ein Modul einzuschließen, um eine seiner Modulmethoden aufzurufen. Sie werden einfach direkt referenziert; zum Beispiel, x = Math.sqrt (2) '. –

+0

Oh ja, danke für deinen Kommentar. Kann auch so tun –

+0

Mein Punkt ist, dass, wenn Sie ein Modul "nur" einschließen die Instanz Methoden enthalten sind; Ruby überspringt einfach Modul-Methoden, so dass 'include' hier irrelevant ist. –