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:
Flip-Flop-Ausdruck ergibt
true
oder
false
, genau wie Vergleichs- und Gleichheitsausdrücke. Das besonders Außergewöhnliche an einem Flip-Flop-Ausdruck ist allerdings, dass sein Wert vom Wert früherer Auswertungen abhängt. Das bedeutet, dass mit einem Flip-Flop-Ausdruck ein Zustand verknüpft ist; er muss Informationen über frühere Auswertungen speichern. Weil er einen Zustand hat, würden Sie wahrscheinlich erwarten, dass er irgendeine Art von Objekt ist. Aber er ist keines – er ist ein Ruby-Ausdruck, und der Ruby-Interpreter speichert den benötigten Zustand (nur einen einzelnen Boolean-Wert) in einer internen, geparsten Darstellung des Ausdrucks.
    Betrachten Sie mit diesem Hintergrundwissen den Flip-Flop im folgenden Code. Beachten Sie, dass das erste
..
im Code ein
Range
-Objekt erzeugt. Das zweite erzeugt einen Flip-Flop-Ausdruck:
(1..10).each {|x| print x if x==3..x==5 }
    Das Flip-Flop besteht aus zwei mit dem Operator
..
verknüpften Boolean-Ausdrücken im Kontext einer Fallentscheidung oder einer Schleife. Ein Flip-Flop-Ausdruck ist
false
, solange und bis der linke Ausdruck
true
ergibt. Nachdem der Ausdruck
true
geworden ist, »kippt« der Ausdruck in einen dauerhaften
true
-Zustand. Er verbleibt in diesem Zustand, und nachfolgende Auswertungen geben
true
zurück, bis der rechte Ausdruck
true
ergibt. Sobald dies geschieht, »klappt« [ 16 ] das Flip-Flop zurück in einen dauerhaften
false
-Zustand. Nachfolgende Auswertungen des Ausdrucks geben
false
zurück, bis der linke Ausdruck wieder
true
wird.
    In dem Codebeispiel wird das Flip-Flop wiederholt für
x
-Werte von
1
bis
10
ausgewertet. Es beginnt im
false
-Zustand und ergibt
false
, wenn
x 1
und
2
ist. Wenn
x==3
ist, wechselt das Flip-Flop auf
true
und gibt
true
zurück. Es gibt weiterhin
true
zurück, wenn
x 4
und
5
ist. Wenn
x==5
ist, wechselt das Flip-Flop allerdings zurück zu
false
und liefert für die restlichen Werte von
x false
zurück. Das Ergebnis ist, dass dieser Code
345
ausgibt.
    Flip-Flops können entweder mit
..
oder mit
...
geschrieben werden. Der Unterschied ist, dass ein
..
-Flip-Flop beim Wechsel auf
true
den Wert
true
zurückgibt, aber auch seinen rechten Ausdruck prüft, um herauszufinden, ob es seinen internen Zustand auf
false
zurücksetzen soll. Die
...
-Form wartet auf ihre nächste Auswertung, bevor sie den rechten Ausdruck überprüft. Betrachten Sie die folgenden beiden Zeilen:
# Gibt "3" aus. Wechselt hin und zurück bei x==3.
(1..10).each {|x| print x if x==3..x>=3 }
# Gibt "34" aus. Kippt, wenn x == 3, und zurück, wenn x==4.
(1..10).each {|x| print x if x==3...x>=3 } # Gibt "34" aus.
    Flip-Flops sind ein ziemlich obskures Feature von Ruby, das Sie in Ihrem Code wahrscheinlich am besten vermeiden. Sie sind jedoch nicht Ruby-exklusiv. Ruby erbt dieses Feature von Perl, das sie wiederum von den Unix-Textbearbeitungstools sed und awk übernimmt. [ 17 ] Flip-Flops waren ursprünglich dafür gedacht, die Zeilen einer Textdatei zwischen einem Start- und einem Endmuster zu finden. Das ist auch weiterhin ein nützlicher Anwendungszweck für sie. Das folgende einfache Ruby-Programm demonstriert ein Flip-Flop. Es liest einen Text zeilenweise und gibt jede Zeile aus, die den Text »TODO« enthält. Dann gibt es weiter Zeilen aus, bis es eine leere Zeile liest:
ARGF.each do |line| # Für jede Zeile der Standardeingabe oder der angegebenen Dateien...
print line if line=~/TODO/..line=~/^$/ # ...Zeilen ausgeben, wenn Flip-Flop true ist.
end
    Es ist schwierig, das exakte Verhalten eines Flip-Flops formal zu beschreiben. Es ist einfacher, Flip-Flops zu verstehen, indem man Code studiert, der sich äquivalent verhält. Die folgende Funktion verhält sich wie das Flip-Flop
x==3..x==5
. Sie programmiert die linke und die rechte Bedingung fest in die Funktion selbst ein und verwendet eine globale Variable, um den Zustand des Flip-Flops zu speichern:
$state = false # Globale Speicherung des Flip-Flop-Zustands
def flipflop(x) # Wert von x gegen das Flip-Flop testen
if !$state # Wenn der gespeicherte Zustand false ist
    result = (x == 3) # Ergebnis ist Wert des linken Operanden
    if result # Wenn das Ergebnis true ist
     $state = !(x == 5) # Gespeicherter Zustand ist Umkehrung des rechten Operanden
    end
    result # Ergebnis zurückgeben
else # Andernfalls, wenn gespeicherter Zustand true
    $state = !(x == 5) # Umkehrung des rechten Operanden speichern
    true # Und ohne Prüfung des linken true zurückgeben
end
end
    Nach der Definition dieser

Weitere Kostenlose Bücher