Blöcke & Procs

Blöcke

Codeblöcke sind in Ruby Codestücke, die in geschweiften Klammern oder zwischen do und end stehen. Sie lassen sich wie Parameter an Methoden übergeben und ermöglichen somit die Realisierung von prozedurealen Parametern, Callback-Methoden und Iteratoren (zu diesen mehr im Abschnitt "Iteratoren"). Mit yield lässt sich ein übergebener Block ausführen, die Methode block_given? testet, ob überhaupt ein Block übergeben wurde.

>> def machEt
>>   if block_given? then
>>     yield
>>     yield
>>     yield
>>   else
>>     puts "Ja, was soll ich denn machen?"
>>   end
>> end
=> nil
>> machEt { puts "Schigong schigong" }
Schigong schigong
Schigong schigong
Schigong schigong
=> nil
>> machEt do print 3-2; print 2+1; end
131313
=> nil
>> machEt
Ja, was soll ich denn machen?
=> nil

Procs

Proc-Objekte sind Codeblöcke, die an einen Satz von lokalen Variablen angebunden sind. Einmal angebunden, kann der Code in verschiedenen Kontexten aufgerufen werden und trotzdem auf diese Variablen zugreifen. Ausgeführt werden procs durch Aufruf der call-Methode.

>> def mal (faktor)
>>   return Proc.new {|x| x*faktor}
>> end
>> mal4 = mal (4)
=> #<0x402e4d64@(irb):41>
>> mal4.call (5)
=> 20

Wird ein Proc-Objekt erzeugt, so bleibt der gesamte Kontext dieses Objekts so lange erhalten, wie auch das Proc-Objekt noch am Leben ist, auch wenn z.B. die aufrufende Umgebung gar nicht mehr existiert.

Proc Objekte können auch implizit erzeugt werden. Wenn dem letzten Parameter einer Methoden-Definition ein & vorangestellt wird, wird der an die Methode übergebene Block automatisch in ein Proc-Objekt umgewandelt. So kann einem Objekt bei der Initialisierung oder auch zur Laufzeit Funktionalität hinzugefügt werden (oder es kann natürlich Funktionalität geändert werden), was dem Programmierer ein hohes Maß an Flexibilität bietet.