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:
verwenden, wenn die Methode
# eine Ausnahme auslöst
y = factorial(x) rescue 0
    Das ist äquivalent zu
y = begin
     factorial(x)
    rescue
     0
    end
    Der Vorteil der Anweisungs-Modifier-Syntax besteht darin, dass die Schlüsselwörter
begin
und
end
nicht benötigt werden. Wenn
rescue
auf diese Weise verwendet wird, muss es allein stehen, ohne Ausnahmeklassennamen und Variablennamen. Ein
rescue
-Modifier behandelt jede
StandardError
-Ausnahme, aber keine Ausnahmen anderer Typen. Anders als die Modifier
if
und
while
hat der Modifier
rescue
einen höheren Rang (siehe Tabelle 4.2 im vorigen Kapitel) als Wertzuweisungsoperatoren. Das bedeutet, dass er nur auf die rechte Seite einer Wertzuweisung (wie im Beispiel oben) angewendet wird und nicht auf den Wertzuweisungsausdruck als Ganzes.

5.7 BEGIN und END
    BEGIN
und
END
sind reservierte Wörter in Ruby, die Code deklarieren, der ganz am Anfang beziehungsweise ganz am Ende eines Programms ausgeführt werden soll. (Beachten Sie, dass
BEGIN
und
END
in Großbuchstaben etwas völlig anderes sind als
begin
und
end
in Kleinbuchstaben.) Wenn es mehrere
BEGIN
-Anweisungen gibt, werden sie in der Reihenfolge ausgeführt, in der der Interpreter sie vorfindet. Wenn es mehrere
END
-Anweisungen gibt, werden diese umgekehrt zu der Reihenfolge ausgeführt, in der sie auftreten – das heißt, die erste wird zuletzt ausgeführt. Diese Anweisungen werden in Ruby nicht häufig eingesetzt. Sie wurden aus Perl übernommen, das sie wiederum von der Textverarbeitungssprache awk geerbt hat.
    Auf
BEGIN
und
END
müssen eine öffnenende geschweifte Klammer, beliebig viel Ruby-Code und eine schließende geschweifte Klammer folgen. Die geschweiften Klammern sind Pflicht;
do
und
end
sind hier nicht erlaubt, zum Beispiel:
BEGIN {
# Globaler Initialisierungscode hier
}
END {
# Globaler Shutdown-Code hier
}
    Die Anweisungen
BEGIN
und
END
unterscheiden sich auf subtile Weise voneinander.
BEGIN
-Anweisungen werden vor allen anderen ausgeführt, einschließlich umgebendem Codes. Das bedeutet, dass sie einen lokalen Variablen-Gültigkeitsbereich definieren, der vollkommen getrennt vom umgebenden Code ist. Es ergibt wirklich nur einen Sinn,
BEGIN
-Anweisungen in Code der obersten Ebene zu schreiben; ein
BEGIN
innerhalb einer Fallentscheidung oder Schleife wird ohne Rücksicht auf die umgebenden Bedingungen ausgeführt. Betrachten Sie diesen Code:
if (false)
BEGIN {
    puts "if"; # Dies wird ausgegeben
    a = 4; # Diese Variable wird nur hier definiert
}
else
BEGIN { puts "else" } # Wird auch ausgegeben
end
10.times {BEGIN { puts "loop" }} # Wird nur einmal ausgegeben
    Der mit allen drei
BEGIN
-Anweisungen verknüpfte Code wird nur genau ein Mal ausgeführt, unabhängig vom Kontext, in dem er auftaucht. Variablen, die in
BEGIN
-Blöcken definiert werden, sind außerhalb des Blocks nicht sichtbar, und Variablen von außerhalb des Blocks sind noch nicht definiert.
    END
-Anweisungen sind anders. Sie werden während der normalen Programmausführung ausgeführt, so dass sie sich die lokalen Variablen mit dem umgebenden Code teilen. Wenn sich eine
END
-Anweisung innerhalb einer Fallentscheidung befindet, die nicht ausgeführt wird, wird der mit ihr verknüpfte Code niemals zur Ausführung bei Programmende registriert. Wenn sich eine
END
-Anweisung in einer Schleife befindet und mehr als einmal ausgeführt wird, wird der mit ihr verknüpfte Code immer noch nur einmal registriert:
a = 4;
if (true)
END { # Dieses END wird ausgeführt.
    puts "if"; # Dieser Code wird registriert.
    puts a # Variable ist sichtbar; gibt "4" aus
}
else
END { puts "else" } # Dies wird nicht ausgeführt.
end
10.times {END { puts "loop" }} # Wird nur einmal ausgeführt
    Die Kernel-Methode
at_exit
stellt eine Alternative zur
END
-Anweisung bereit; sie registriert einen Codeblock, der genau dann ausgeführt wird, wenn der Interpreter beendet wird. Genau wie bei
END
-Blöcken wird der mit dem ersten
at_exit
-Aufruf verknüpfte Code zuletzt ausgeführt. Wenn die
at_exit
-Methode mehrmals innerhalb einer Schleife aufgerufen wird, wird der mit ihr verknüpfte Block beim Beenden des Interpreters mehrmals ausgeführt.

5.8 Threads, Fiber und Continuations
    Dieser Abschnitt stellt Threads vor, die Rubys Kontrollstruktur zur nebenläufigen (oder gleichzeitigen) Ausführung darstellen, sowie zwei exotischere Kontrollstrukturen, die Fiber und Continuations genannt werden.
    5.8.1 Threads zur Nebenläufigkeit
    Ein Ausführungs-Thread ( thread of execution )

Weitere Kostenlose Bücher