Methods aren't closures in Ruby - only blocks are. In that example,
the makeCounter method is returning a lambda, which is a block (and
thus a closure). A closure is (from what I understand) just a block
that remembers its context. Consider this:
a = 34
b = proc { a * 2 }
# in a different scope
b.call # = > 68
Even though a has gone out of scope by the time b is actually called,
Ruby saves the value of a with b so that when you call it, b can
return the proper value. In other words, a closure is just a block
that refers to its environment.
Bill
On Wed, 20 Oct 2004 03:04:20 +0900, Sam Sungshik Kong
<ssk / chol.nospam.net> wrote:
> Hi, group!
>
> I am trying to understand what exactly a closure is.
> I'm kinda familiar with C#.
> In C# 2.0 (the next version that's coming out), there's a anonymous
> delegate.
> People say that it's a closure (See
> http://martinfowler.com/bliki/Closures.html).
> They even compare it with Ruby codes saying that closure is block.
> Is it true?
>
> When I saw the closure example in Ruby, it was not just a block.
>
> Here's a typical example of Ruby closure.
>
> <snip>
> def makeCounter
> var = 0
> lambda do
> var +=1
> end
> end
>
> c1 = makeCounter
> c1.call
> c1.call
> c1.call
>
> c2 = makeCounter
>
> puts "c1 = #{c1.call}, c2 = #{c2.call}"
> </snip>
>
> Here is what the above page(http://martinfowler.com/bliki/Closures.html)
> says...
>
> <snip>
> Closures have been around for a long time. I ran into them properly for the
> first time in Smalltalk where they're called Blocks. Lisp uses them heavily.
> They're also present in the Ruby scripting language - and are a major reason
> why many rubyists like using Ruby for scripting.
>
> Essentially a closure is a block of code that can be passed as an argument
> to a function call.
>
> ....
>
> In a language that has Closures, in this case Ruby, I'd write this.
>
> def managers(emps)
> return emps.select {|e| e.isManager}
> end
> </snip>
>
> This is just a block, right?
> Is it also a closure?
>
> I'm confused.
> Can somebody enlighten me?
>
>
> Sam
>
>