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:
aufgerufen wird.
set_trace_func
ist praktisch, wenn Sie ein Debugger-Modul schreiben möchten, das ein Programm Zeile für Zeile ausführt; aber wir werden das hier nicht detailliert beschreiben.

8.7 ObjectSpace und GC
    Das Modul
ObjectSpace
definiert eine Handvoll Low-Level-Methoden, die gelegentlich für Debugging oder Metaprogrammierung nützlich sein können. Die erwähnenswerteste Methode ist
each_object
, ein Iterator, der über jedes Objekt (oder jede Instanz einer angegebenen Klasse), das der Interpreter kennt, iterieren kann:
# Eine Liste aller bekannten Klassen ausgeben
ObjectSpace.each_object(Class) {|c| puts c }
    Die Methode
ObjectSpace._id2ref
ist die Umkehrung von
Object.object_id
: Sie nimmt eine Objekt-ID als Argument entgegen und gibt das zugehörige Objekt zurück oder löst einen
RangeError
aus, wenn es kein Objekt mit dieser ID gibt.
    ObjectSpace.define_finalizer
erlaubt die Registrierung einer
Proc
oder eines Codeblocks, die oder der bei der Garbage-Collection des angegebenen Objekts aufgerufen wird. Sie müssen bei der Registrierung eines solchen Finalizers jedoch vorsichtig sein, da der Finalizer-Block das Objekt, das der Garbage-Collection zugeführt wurde, nicht nutzen darf. Alle Werte, die zur Finalisierung des Objekts benötigt werden, müssen im Gültigkeitsbereich des Finalizer-Blocks gesammelt werden, damit sie ohne Dereferenzierung des Objekts zur Verfügung stehen. Verwenden Sie
ObjectSpace.undefine_finalizer
, um alle für ein Objekt registrierten Finalizer-Blöcke zu löschen.
    Die letzte
ObjectSpace
-Methode ist
ObjectSpace.garbage_collect
, die die Ausführung von Rubys Garbage-Collector erzwingt. Die Garbage-Collection-Funktionalität steht auch durch das Modul
GC
zur Verfügung.
GC.start
ist ein Synonym für
ObjectSpace.garbage_collect
. Die Garbage-Collection kann mit
GC.disable
vorübergehend deaktiviert und mit
GC.enable
reaktiviert werden.
    Die Kombination der Methoden
_id2ref
und
define_finalizer
erlaubt die Definition »schwacher« Referenzobjekte, die eine Referenz auf einen Wert enthalten, ohne den Wert daran zu hindern, der Garbage-Collection zugeführt zu werden, wenn sie ansonsten unerreichbar werden, siehe die Klasse
WeakRef
in der Standardbibliothek (in lib/weakref.rb ) für ein Beispiel.

8.8 Benutzerdefinierte Kontrollstrukturen
    Rubys Verwendung von Blöcken macht es Ihnen zusammen mit seiner Syntax mit optionalen Klammern sehr leicht, Iteratormethoden zu definieren, die so aussehen und sich so verhalten wie Kontrollstrukturen. Die Methode
loop
von
Kernel
ist ein einfaches Beispiel. In diesem Abschnitt entwickeln wir drei weitere Beispiele. Die Beispiele hier verwenden Rubys Threading-API; möglicherweise müssen Sie erst „9.9 Threads und Parallelität“ lesen, um alle Details zu verstehen.
    8.8.1 Die Ausführung verzögern und wiederholen: after und every
    Listing 8.1 definiert globale Methoden namens
after
und
every
. Jede von ihnen nimmt ein numerisches Argument entgegen, das eine Anzahl von Sekunden darstellt und mit dem ein Block verknüpft ist.
after
erzeugt einen neuen Thread und gibt das
Thread
-Objekt unmittelbar zurück. Der neu erzeugte Thread schläft für die angegebene Anzahl von Sekunden und ruft dann (ohne Argumente) den Block auf, den Sie bereitstellen.
every
ist ähnlich, ruft den Block aber wiederholt auf und schläft zwischen den Aufrufen die angegebene Anzahl von Sekunden. Das zweite Argument von
every
ist ein Wert, der an den ersten Aufruf des Blocks übergeben wird. Der Rückgabewert jedes Aufrufs wird zu dem Wert, der für den nächsten Aufruf übergeben wird. Der mit
every
verknüpfte Block kann
break
verwenden, um jegliche zukünftigen Aufrufe zu verhindern.
    Hier sehen Sie etwas Beispielcode, der
after
und
every
verwendet:
require 'afterevery'
1.upto(5) {|i| after i { puts i} } # Langsam die Zahlen 1 bis 5 ausgeben
sleep(5) # Fünf Sekunden warten
every 1, 6 do |count| # Nun langsam 6 bis 10 ausgeben
puts count
break if count == 10
count + 1 # Der nächste Wert zum Zählen
end
sleep(6) # Dem obigen Code Zeit zur Ausführung geben
    Der
sleep
-Aufruf am Ende dieses Codes hindert das Beispielprogramm daran, sich zu beenden, bevor der von
every
erzeugte Thread seinen Zählvorgang beendet hat. Nach diesem Anwendungsbeispiel für
after
und
every
sind wir nun bereit, ihre Implementierungen vorzustellen. Denken Sie daran, „9.9 Threads und Parallelität“ zu konsultieren, wenn Sie
Thread.new
nicht verstehen.
    #
# Kernel-Methoden after

Weitere Kostenlose Bücher