Der Sommer geht zwar langsam zuende (oder: an meinem Ende der Welt ist er es schon), trotzdem kann man seinen Ruby-Code noch sommerlich kleiden (und in der CPU ist eh immer wohlig warm). Wie wärs mal mit Flip-Flops?
Bildquelle: http://www.flickr.com/photos/stuckincustoms/ / CC BY-NC-SA 2.0
Flip-Flops sind eine wenig beachtete Syntaxeigenheit von Ruby - selbst "The Ruby Programming Language" bezeichnet sie als "ein ziemlich obskures Feature". Trotzdem eignen sie sich immer für eine Fingerübung oder um Anfänger zu verschrecken. Das Geheimnis von Flip-Flops ist, dass sich .. und ... innerhalb von Conditionals nicht ganz wie erwartet als Range-Operatoren verhalten. Schauen wir uns mal diese Beispiele an:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
puts "Beispiel 1:" (0..20).each do |x| if ((x%10) == 5)..((x%10) == 5) print "#{x} " end end puts "\nBeispiel 2:" (0..20).each do |x| if ((x%10) == 5)...((x%10) == 5) print "#{x} " end end |
Der Output ist folgender:
1 2 3 4 |
Beispiel 1: 5 15 Beispiel 2: 5 6 7 8 9 10 11 12 13 14 15 |
Was passiert, ist schnell klar: sobald die linke Aussage eines solchen Ausdrucks zu true evaluiert, erhält der Flip-Flop den Wert true. Diesen behält er solange, bis die rechte Aussage zu true evaluiert. Der Unterschied beider Konstrukte besteht darin, dass .. beide Aussagen prüft - also den Flip-Flop nur für einen Durchlauf anschaltet, wenn die beide Aussagen gleichzeitig eintreten. ... prüft bei jedem Durchlauf nur eine der beiden Bedingungen. Deshalb bleibt der Flip-Flop solange angeschaltet, bis die rechte Bedingung wieder eintritt.
Für Konsoleros: .. entspricht damit den Flip-Flops aus awk, ... denen von sed.
Als letzte Worte: "The Ruby Programming Language" rät von der Verwendung im großen Stil ab. In freier Wildbahn hab ich die Teile auch noch nicht gesehen. Allerdings können sie einem beim Code-Golfen einige Zeilen sparen.
Kommentar schreiben
Kommentare
Ruby schafft es auch immer wieder einen zu überaschen oO Dieses Feature kannte ich noch nicht. Obgleich es sicher in seltenen Situationen auch praktisch sein kann, find’ ich es dennoch alles andere als intuitiv. Ich musste zig mal über den Code gucken, bis ich das Prinzip verstanden habe. Ich werde es jedenfalls nicht benutzen. Aber falls im Forum mal wieder um die Wette gegolft wird, komme ich darauf zurück =P
Naja, ich war auch überrascht, als ichs in Matz’s Buch gelesen habe. Wenn ichs richtig sehe, ist das mehr so ein “wouldn’t it be cool, if?”-Feature aus den Tagen, als Ruby noch nicht stabil war und man sich von Perl alles geklaut hat, was man cool fand ;). Ich finds wie gesagt einen lustiges Detail – verwenden würde ich es auch nicht.