lambdas mit eingebauten bindings 0

Posted by fwoeck
on Saturday, January 10

lambdas erzeugen an sich automatisch bindings, d.h. sie behalten stets den sie zur Laufzeit umgebenden Variablen-, und self-Kontext.

In diesem Schnipsel:

def counter_with_inc(start, inc)
  start -= inc
  lambda { start += inc }
end

counter = counter_with_inc(10, 3)

puts counter.call
puts counter.call
puts counter.call

=> 10
=> 13
=> 16

passiert folgendes: counter_with_inc wird aufgerufen und dekrementiert einmal start um inc. Die Methode gibt jetzt das lambda “start += inc” an counter zurück und erzeugt gleichzeitig ein binding, auf das nachher zurückgegriffen wird, wenn counter.call aufgerufen wird. Das binding wird also offenbar aktualisiert, da der Wert von start steigt.

Unklar ist mir im Moment, warum dies nicht funktioniert, wenn man in counter_with_inc eine neue Zählvariable sum einführt, die man dann in das lambda hineinzieht: “lambda { sum = ( sum ||= start) + inc }”.