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:
haben, bleibt es für den Rest der Moduldefinition aktiv — wenn Sie also Methoden definieren wollen, die keine Modulfunktionen werden sollen, müssen Sie diese vorher angeben.
    Es mag auf den ersten Blick überraschen, dass
module_function
die Instanzmethoden eines Moduls privat macht. Der Grund dafür ist weniger die Zugriffskontrolle, da die Methoden offensichtlich auch über den Namensraum des Moduls öffentlich verfügbar sind. Stattdessen werden die Methoden privat gemacht, um sie auf einen Aufruf im Funktionsstil ohne ein explizites Ziel einzuschränken. (Der Grund dafür, dass diese Methoden als Modul funktionen bezeichnet werden und nicht als Methoden, liegt darin, dass sie im Funktionsstil aufgerufen werden müssen.) Dadurch, dass Modulfunktionen zwangsweise ohne ein Ziel aufgerufen werden, wird es weniger wahrscheinlich, dass sie unabsichtlich für echte Instanzmethoden gehalten werden. Stellen Sie sich vor, wir würden eine Klasse definieren, deren Methoden eine Menge trigonometrischer Berechnungen durchführen. Aus Bequemlichkeit mixen wir das Modul
Math
hinein. Dann können wir die Methode
sin
als Funktion aufrufen, statt
Math.sin
verwenden zu müssen. Die Methode
sin
wird implizit für
self
aufgerufen, aber wir gehen eigentlich nicht davon aus, dass sie etwas mit
self
tut.
    Wenn Sie eine Modulfunktion definieren, sollten Sie vermeiden,
self
zu verwenden, da der Wert von
self
davon abhängt, wie die Funktion aufgerufen wird. Es ist sicherlich möglich, eine Modulfunktion zu definieren, die sich abhängig von der Art des Aufrufs unterschiedlich verhält. Aber wenn Sie das tun wollen, ist es sinnvoller, einfach eine Klassenmethode und eine Instanzmethode zu definieren.

7.6 Laden von Modulen
    Ruby-Programme können in mehrere Dateien aufgeteilt werden. Die natürlichste Art, ein Programm zu unterteilen, ist, jede nicht triviale Klasse und jedes Modul in einer eigenen Datei unterzubringen. Diese separaten Dateien können dann mithilfe von
require
oder
load
wieder zu einem einzelnen Programm zusammengefügt (und bei sorgfältigem Design auch von anderen Programmen wiederverwendet) werden. Dabei handelt es sich um globale Funktionen, die in
Kernel
definiert sind, aber wie Schlüsselwörter verwendet werden. Die Methode
require
wird auch für das Laden von Dateien aus der Standardbibliothek genutzt.
    load
und
require
erfüllen ähnliche Zwecke, auch wenn
require
viel häufiger verwendet wird als
load
. Beide Funktionen können eine angegebene Datei mit Ruby-Quellcode laden und ausführen. Wenn die zu ladende Datei mit einem absoluten Pfad angegeben wird oder relativ zu
~
ist (dem Home-Verzeichnis des Anwenders), wird die angegebene Datei geladen. Normalerweise wird die Datei aber als relativer Pfad angegeben und
load
und
require
suchen danach in den Verzeichnissen des Ladepfads von Ruby (Details dazu finden Sie weiter unten).
    Trotz der vielen Gemeinsamkeiten gibt es wichtige Unterschiede zwischen
load
und
require
:
    Neben dem Laden des Quellcodes kann
require
auch binäre Erweiterungen von Ruby laden. Binäre Erweiterungen sind natürlich abhängig von der Implementierung, aber in C-basierten Implementierungen handelt es sich üblicherweise um Shared-Library-Dateien mit Erweiterungen wie .so oder .dll .
load
erwartet einen vollständigen Dateinamen einschließlich einer Erweiterung. An
require
wird meist eher ein Bibliotheksname ohne Erweiterung übergeben und seltener ein Dateiname. In diesem Fall wird nach einer Datei gesucht, die den Bibliotheksnamen als Namen und eine passende Endung für Erweiterungen im Quellcode oder als Binärdatei besitzt. Wenn ein Verzeichnis sowohl eine Quelldatei mit .rb als auch eine Datei mit Binärerweiterung besitzt, lädt
require
die Quelldatei statt der Binärdatei.
load
kann dieselbe Datei mehrfach laden.
require
versucht, das mehrfache Laden derselben Datei zu verhindern. (
require
kann dabei allerdings ausgetrickst werden, indem Sie zwei verschiedene, aber äquivalente Pfade zur selben Bibliotheksdatei angeben. In Ruby 1.9 erweitert
require
relative Pfade zu absoluten Pfaden, wodurch es etwas schwieriger wird, zu tricksen.)
require
merkt sich die geladenen Dateien, indem es sie in das globale Array
$"
einfügt (auch bekannt als
$LOADED_FEATURES
).
load
macht das nicht.
load
lädt die angegebene Datei im aktuellen
$SAFE
-Level.
require
lädt die angegebene Datei mit
$SAFE
gleich
0
, selbst wenn der Code, der
require
aufruft, einen höheren Wert für diese Variable

Weitere Kostenlose Bücher