Anonym und dynamisch: Blöcke

Du bist hier: Hinterkattentuffel - Ruby - Anonym und dynamisch: Blöcke
Prev: Externe Programme starten

Wenn man in Ruby über Enumerables iteriert, schreibt man sie hin, als wäre es das natürlichste auf der Welt: Blöcke. Hier zeigt sich vielleicht am stärksten Rubys Verwandschaft zu Smalltalk. Unter Ruby kann man einer Variable Codeblöcke zuweisen:

IRB> aSortBlock = proc { |x, y| y <=> x }
=> #<Proc:0x2dddcd8>
IRB> (1..10).sort &aSortBlock
=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

In solchen Blöcken kann man sogar lokale Variable referenzieren, und zwar nicht deren Wert sondern tatsächlich die Variable:

IRB> grenze = 5
=> 5
IRB> aSortBlock = proc { |x, y| x < grenze ? y <=> x : x <=> y }
=> #<Proc:0x2dc25b8>
IRB> (1..10).sort &aSortBlock
=> [5, 6, 7, 8, 9, 10, 4, 3, 2, 1]
IRB> grenze = 3
=> 3
IRB> (1..10).sort &aSortBlock
=> [3, 4, 5, 6, 7, 8, 9, 10, 2, 1]

Und man kann Funktionen schreiben, die einen Block als Argument verlangen:

IRB> def tag(name, &block)
IRB>   printf "<#{name}>"
IRB>   block.call
IRB>   printf "</#{name}>\n"
IRB> end
=> nil
IRB> tag('keinhtml') { print 'Hello World' }
<keinhtml>Hello World</keinhtml>
=> nil

Wie man sieht, lässt sich damit z. B. ein Html-Generator schreiben. Ein erweitertes Gerüst könnte etwa so aussehen: htmlgen_0.1.rb.txt. Tatsächlich gibt es ein Modul CGI, welches so ähnlich funktioniert.

Next: Aus Schleifen ausbrechen