From: Clemens Hintze Date: 2000-09-11T19:35:18+09:00 Subject: [ruby-talk:4841] Re: closures >>>>> "Steve" == Steve Merrick writes: Steve> "Stuart Zakon" wrote in Steve> message news:8p2raa$fbq$1@nnrp1.deja.com... >> Can somebody please explain what a closure is within the >> context of Ruby? (Simple explanation, simple example). Steve> I too would be grateful for such an explanation. "Closure" Steve> has become trendy in recent years, but I'm humble enough Steve> (not really! ;-) to admit I haven't a clue what it is. ;-} Hmmm ... it something everybody knows but difficult to explain ;-) Let me try: I would explain a closure as a piece of code that happens to remember the whole context it was created in! In opposition to functions/ methods (which establish a context or work in a context established by others), a closure works only in its birth context. In a class a method works in a context created by the constructor. A subroutine works in a context created by itself. In Ruby a context is a part of code surrounded via '{' ... '}' or 'do' ... 'end'. Look at this: age = 12 clos = proc { age += 1; puts "Inner age is #{age}" } clos.call puts "Outer age is #{age}" age = 36 clos.call puts "Outer age is #{age}" will gives us: Inner age is 13 Outer age is 13 Inner age is 37 Outer age is 37 Here the closure is surrounded via '{' ... '}'. We use 'proc' to make the closure an object we can deal with (e.g. assign it to variable 'clos'). The variable 'age' is now tied together with the closure. Changing it anywhere in the closure OR the surrounding environment will be recognized at both places! Steve> -- Steve HTH, \cle