Die Programmiersprache Ruby (German Edition)
außer
nil
und
false
wie
true
verhalten:
if x # Wenn x nicht nil ist,
puts x # soll es ausgegeben werden
end
Es ist wichtig, daran zu denken, dass sich Werte wie
0
,
0.0
und der leere String
""
in Ruby wie
true
verhalten, was überraschend ist, wenn Sie an Sprachen wie C oder JavaScript gewöhnt sind.
3.8.8 Objekte kopieren
Die Klasse
Object
definiert zwei nah miteinander verwandte Methoden zum Kopieren von Objekten. Sowohl
clone
als auch
dup
geben eine oberflächliche Kopie des Objekts zurück, für das sie jeweils aufgerufen werden. Wenn das kopierte Objekt einen internen Zustand enthält, der auf andere Objekte verweist, werden nur die Objektreferenzen kopiert, aber nicht die referenzierten Objekte selbst.
Wenn das kopierte Objekt eine Methode namens
initialize_copy
definiert, dann erzeugen
clone
und
dup
einfach eine neue, leere Instanz der Klasse und rufen die Methode
initialize_copy
für diese leere Instanz auf. Das zu kopierende Objekt wird als Argument übergeben, und sein »Kopien-Konstruktor« kann die Kopie je nach Bedarf initialisieren. Beispielsweise könnte die Methode
initialize_copy
die internen Daten eines Objekts rekursiv kopieren, so dass das Ergebnisobjekt nicht bloß eine oberflächliche Kopie des Originals ist.
Klassen können die Methoden
clone
und
dup
auch direkt überschreiben, um beliebige Arten von Kopien zu erstellen.
Es gibt zwei wichtige Unterschiede zwischen den von
Object
definierten Methoden
clone
und
dup
. Erstens kopiert
clone
auch die (weiter unten behandelten) Freeze- und Taint-Zustände eines Objekts, während
dup
nur den Taint-Zustand kopiert; ein Aufruf von
dup
für ein Freeze-Objekt liefert eine Nicht-Freeze-Kopie zurück. Zweitens kopiert
clone
auch etwaige Singleton-Methoden des Objekts, was
dup
nicht tut.
3.8.9 Objekt-Marshaling
Sie können den Zustand eines Objekts speichern, indem Sie es an die Klassenmethode
Marshal.dump
übergeben. [ 12 ] Wenn Sie ein I/O-Datenstromobjekt als zweites Argument angeben, schreibt
Marshal.dump
den Zustand des Objekts (und rekursiv auch sämtliche referenzierten Objekte) in diesen Stream. Andernfalls wird der kodierte Zustand einfach als binärer String zurückgegeben.
Um ein Marshal-Objekt wiederherzustellen, können Sie einen String oder I/O-Datenstrom, der das Objekt enthält, an
Marshal.load
übergeben.
Das Marshaling eines Objekts ist eine sehr einfache Möglichkeit, den Zustand des Objekts für den späteren Einsatz zu speichern, und diese Methoden können verwendet werden, um ein automatisches Dateiformat für Ruby-Programme bereitzustellen. Beachten Sie jedoch, dass das Format von der Version von
Marshal.dump
und
Marshal.load
abhängig ist, und es besteht keine Garantie dafür, dass neuere Ruby-Versionen in der Lage sind, Marshal-Objekte zu lesen, die von älteren Ruby-Versionen geschrieben wurden.
Ein weiterer Verwendungszweck für
Marshal.dump
und
Marshal.load
ist die Erstellung exakter Tiefenkopien von Objekten:
def deepcopy(o)
Marshal.load(Marshal.dump(o))
end
Beachten Sie, dass Dateien und I/O-Datenströme sowie
Method
- und
Binding
-Objekte zu dynamisch für das Marshaling sind; es gäbe keine verlässliche Möglichkeit, ihren Zustand wiederherzustellen.
YAML (»YAML Ain't Markup Language«) ist eine häufig verwendete Alternative zum Modul
Marshal
, die Objekte in einem für Menschen lesbaren Textformat abspeichert (und wieder daraus lädt). Es gehört zur Standardbibliothek, und Sie müssen
require 'yaml'
ausführen, um es einzusetzen.
3.8.10 Objekte einfrieren
Jedes Objekt kann durch den Aufruf seiner
freeze
-Methode eingefroren werden. Ein Freeze-Objekt wird unveränderlich – kein Bestandteil seines inneren Zustands kann geändert werden, und ein Versuch, irgendeine seiner Mutator-Methoden aufzurufen, schlägt fehl:
s = "Eis" # Strings sind veränderliche Objekte
s.freeze # Den String unveränderlich machen
s.frozen? # true: Der String wurde eingefroren
s.upcase! # TypeError: Freeze-String kann nicht geändert werden
s[0] = "ni" # TypeError: Freeze-String kann nicht geändert werden
Das Einfrieren eines Klassenobjekts verhindert das Hinzufügen neuer Methoden zu dieser Klasse.
Sie können mithilfe der Methode
frozen?
überprüfen, ob ein Objekt eingefroren wurde. Nach dem Einfrieren gibt es keine Möglichkeit mehr, ein Objekt »aufzutauen«. Wenn Sie ein Freeze-Objekt mit
clone
kopieren, wird auch die Kopie eingefroren. Kopieren Sie ein Freeze-Objekt dagegen mit
dup
, dann ist die Kopie nicht
Weitere Kostenlose Bücher