Bücher online kostenlos Kostenlos Online Lesen
Die Programmiersprache Ruby (German Edition)

Die Programmiersprache Ruby (German Edition)

Titel: Die Programmiersprache Ruby (German Edition) Kostenlos Bücher Online Lesen
Autoren: David Flanagan , Yukihiro Matsumoto
Vom Netzwerk:
kann das Modul
Enumerable
einmixen, um direkt viele hilfreiche Iteratoren zu erhalten.
Comparable
ist ähnlich — es definiert Vergleichsoperatoren, die den allgemeinen Vergleichsoperator
<=>
nutzen. Wenn Ihre Klasse
<=>
definiert, können Sie
Comparable
einmixen, um völlig kostenlos
<
,
<=
,
== >
,
>=
und
between?
zu erhalten.
    Um ein Modul in eine Klasse einzumixen, verwenden Sie
include
.
include
wird normalerweise wie ein Schlüsselwort der Sprache genutzt:
class Point
include Comparable
end
    Aber eigentlich handelt es sich um eine private Instanzmethode von
Module
, die implizit für
self
aufgerufen wird — die Klasse, in die das Modul eingebunden wird. In Methodenform sähe der Code so aus:
class Point
include(Comparable)
end
    Da es sich bei
include
um eine private Methode handelt, muss sie als Funktion aufgerufen werden, und wir können nicht einfach
self.include(Comparable)
schreiben. Die Methode
include
übernimmt eine beliebige Zahl von
Module
-Objekten zum Einmixen, so dass eine Klasse, die
each
und
<=>
definiert, diese Zeile mit aufnehmen kann:
include Enumerable, Comparable
    Das Einbinden eines Moduls wirkt sich auf die Methode
is_a?
zur Typprüfung und den Case-Vergleichsoperator
===
aus. So mixt zum Beispiel
String
das Modul
Comparable
und in Ruby 1.8 zudem das Modul
Enumerable
hinein:
"text".is_a? Comparable # => true
Enumerable === "text" # => true in Ruby 1.8, false in 1.9
    Beachten Sie, dass
instance_of?
nur die Klasse seines Empfängers prüft, keine Superklassen oder Module, so dass das Folgende zu
false
führt:
"text".instance_of? Comparable # => false
    Auch wenn jede Klasse ein Modul ist, ermöglicht die Methode
include
nicht, eine Klasse in eine andere Klasse aufzunehmen. Die Argumente von
include
müssen durch
module
deklarierte Module sein, keine Klassen.
    Es ist aber erlaubt, ein Modul in ein anderes einzubinden. Das führt einfach dazu, dass die Instanzmethoden des eingebundenen Moduls zu Instanzmethoden des einbindenden Moduls werden. Schauen Sie sich als Beispiel diesen Code aus Kapitel 5 an:
module Iterable # Klassen, die next definieren, können dieses Modul einbinden.
include Enumerable # Definiere Iteratoren basierend auf each
def each # Definiere each basierend auf next
    loop { yield self.next }
end
end
    Normalerweise mixt man ein Modul mit der Methode
Module.include
hinein. Eine andere Möglichkeit dazu ist die Verwendung von
Object.extend
. Diese Methode sorgt dafür, dass die Instanzmethoden des angegebenen Moduls zu Singleton-Methoden des Empfängerobjekts werden. (Und wenn das Zielobjekt eine
Class
-Instanz ist, werden die Methoden des Ziels zu Klassenmethoden dieser Klasse.) Hier sehen Sie ein Beispiel:
countdown = Object.new # Ein gutes altes Object
def countdown.each # Der each-Iterator als Singleton-Methode
yield 3
yield 2
yield 1
end
countdown.extend(Enumerable) # Jetzt hat das Objekt alle Enumerable-Methoden.
print countdown.sort # Ausgabe: "[1, 2, 3]"
    7.5.3 Einbindbare Namensraummodule
    Es ist möglich, Module zu definieren, die einen Namensraum festlegen, deren Methoden aber trotzdem eingemixt werden können. Das Modul
Math
funktioniert so:
Math.sin(0) # => 0.0: Math ist ein Namensraum.
include 'Math' # Der Namensraum Math kann eingebunden werden.
sin(0) # => 0.0: Jetzt haben wir einfachen Zugriff auf die Funktionen.
    Das Modul
Kernel
funktioniert so: Wir können seine Methoden über den Namensraum
Kernel
oder als private Methoden von
Object
aufrufen, in das es eingebunden ist.
    Wenn Sie ein Modul wie
Math
oder
Kernel
erstellen wollen, definieren Sie Ihre Methoden als Instanzmethoden des Moduls. Dann verwenden Sie
module_function
, um diese Methoden in »Modulfunktionen« umzuwandeln.
module_function
ist eine private Instanzmethode von
Module
, so ähnlich wie die Methoden
public
,
protected
und
private
. Es erwartet eine beliebige Zahl von Methodennamen (als Symbole oder Strings). Die wichtigste Auswirkung eines Aufrufs von
module_function
ist, dass Klassenmethodenkopien der angegebenen Methoden erzeugt werden. Ein zweiter Effekt ist, dass die Instanzmethoden privat werden (wir werden dazu gleich noch etwas sagen müssen.)
    Wie die Methoden
public
,
protected
und
private
kann die Methode
module_function
auch ohne Argumente aufgerufen werden. In diesem Fall werden alle im Folgenden im Modul definierten Methoden zu Modulfunktionen: Sie werden öffentliche Klassenmethoden und private Instanzmethoden. Nachdem Sie einmal
module_function
ohne Argumente aufgerufen

Weitere Kostenlose Bücher