[#4766] Wiki — "Glen Stampoultzis" <trinexus@...>

21 messages 2000/09/04
[#4768] RE: Wiki — "NAKAMURA, Hiroshi" <nahi@...> 2000/09/04

Hi, Glen,

[#4783] Re: Wiki — Masatoshi SEKI <m_seki@...> 2000/09/04

[#4785] Re: Wiki — "NAKAMURA, Hiroshi" <nakahiro@...> 2000/09/05

Howdy,

[#4883] Re-binding a block — Dave Thomas <Dave@...>

16 messages 2000/09/12

[#4930] Perl 6 rumblings -- RFC 225 (v1) Data: Superpositions — Conrad Schneiker <schneik@...>

Hi,

11 messages 2000/09/15

[#4936] Ruby Book Eng. translation editor's questions — Jon Babcock <jon@...>

20 messages 2000/09/16

[#5045] Proposal: Add constants to Math — Robert Feldt <feldt@...>

15 messages 2000/09/21

[#5077] Crazy idea? infix method calls — hal9000@...

This is a generalization of the "in" operator idea which I

17 messages 2000/09/22

[#5157] Compile Problem with 1.6.1 — Scott Billings <aerogems@...>

When I try to compile Ruby 1.6.1, I get the following error:

15 messages 2000/09/27

[ruby-talk:4795] Re: closures

From: Yasushi Shoji <yashi@...>
Date: 2000-09-05 22:22:00 UTC
List: ruby-talk #4795
At Wed, 6 Sep 2000 00:29:21 +0900,
Dave Thomas <Dave@thomases.com> wrote:

> > Can somebody please explain what a closure is within the context of
> > Ruby? (Simple explanation, simple example).
> 
> A closure is simply a chunk of code that "remembers" the context that
> it originally appeared in. This is unusual, because in conventional
> block-structured languages, once something goes out of scope it is
> lost.

Dave has already explained closure nicely, so I'll show a pitfall.

As Dave stated, a closure remembers the context that a chunk of code
"originally" appeared in.


a = 1

obj = Proc.new {
  print "scope B: ", a, "\n"
}

print "scope A: ", a, "\n"
obj.call

a = 20
obj.call

$ ruby proc.rb
scope A: 1
scope B: 1
scope B: 20


The code above showed that Proc'ed block remebered 'original' context,
rather than remembering the value of 'a' at the block which is 1.

In the above example the scope of the variable 'a' is in toplevel,
therefore it's not out of scope after the block.  If it's out of
scope, assign to variable 'a' doesn't, of cause, affect.


def foo(a)
  proc { print "scope B: ", a, "\n" }
end

obj = foo(1)
obj.call

a = 20      # first appearance of 'a' in this scope
obj.call    # so it doesn't affect variable 'a' in the block

$ ruby proc_out.rb
scope B: 1
scope B: 1


hope this helps,
--
            yashi

In This Thread