|
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 |