[#11822] RCR: Input XML support in the base Ruby — Dave Thomas <Dave@...>

15 messages 2001/03/01

[#11960] Not Ruby, for me, for the moment at least — "Michael Kreuzer" <mkreuzer@... (nospam)>

I wrote on this newsgroup last weekend about how I was considering using

11 messages 2001/03/04

[#12023] French RUG ? — "Jerome" <jeromg@...>

Hi fellow rubyers,

16 messages 2001/03/05

[#12103] disassembling and reassembling a hash — raja@... (Raja S.)

Given a hash, h1, will the following always hold?

20 messages 2001/03/06

[#12204] FEATURE REQUEST: 'my' local variables — Leo Razoumov <see_signature@127.0.0.1>

Ruby is, indeed, a very well designed language.

64 messages 2001/03/07
[#12250] Re: FEATURE REQUEST: 'my' local variables — Leo Razoumov <see_signature@127.0.0.1> 2001/03/07

>>>>> "GK" == GOTO Kentaro <gotoken@math.sci.hokudai.ac.jp> writes:

[#12284] Re: FEATURE REQUEST: 'my' local variables — gotoken@... (GOTO Kentaro) 2001/03/08

In message "[ruby-talk:12250] Re: FEATURE REQUEST: 'my' local variables"

[#12289] Re: FEATURE REQUEST: 'my' local variables — matz@... (Yukihiro Matsumoto) 2001/03/08

Hi,

[#12452] Re: FEATURE REQUEST: 'my' local variables — gotoken@... (GOTO Kentaro) 2001/03/12

In message "[ruby-talk:12289] Re: FEATURE REQUEST: 'my' local variables"

[#12553] Re: FEATURE REQUEST: 'my' local variables — Dave Thomas <Dave@...> 2001/03/13

matz@zetabits.com (Yukihiro Matsumoto) writes:

[#12329] Math package — Mathieu Bouchard <matju@...>

18 messages 2001/03/09

[#12330] Haskell goodies, RCR and challenge — Robert Feldt <feldt@...>

Hi,

19 messages 2001/03/09
[#12374] Re: Haskell goodies, RCR and challenge — matz@... (Yukihiro Matsumoto) 2001/03/10

Hi,

[#12349] Can Ruby-GTK display Gif Png or Jpeg files? — Phlip <phlip_cpp@...>

Ruby-san:

20 messages 2001/03/09

[#12444] class variables — Max Ischenko <max@...>

14 messages 2001/03/12

[#12606] Order, chaos, and change requests :) — Dave Thomas <Dave@...>

17 messages 2001/03/14

[#12635] email address regexp — "David Fung" <dfung@...>

i would like to locate probable email addresses in a bunch of text files,

12 messages 2001/03/14

[#12646] police warns you -- Perl is dangerous!! — Leo Razoumov <see_signature@127.0.0.1>

I just read this story on Slashdot

14 messages 2001/03/14
[#12651] Re: police warns you -- Perl is dangerous!! — pete@... (Pete Kernan) 2001/03/14

On 14 Mar 2001 11:46:35 -0800, Leo Razoumov <see_signature@127.0.0.1> wrote:

[#12691] Re: police warns you -- Perl is dangerous!! — "W. Kent Starr" <elderburn@...> 2001/03/15

On Wednesday 14 March 2001 15:40, Pete Kernan wrote:

[#12709] [OFFTOPIC] Re: police warns you -- Perl is dangerous!! — Stephen White <spwhite@...> 2001/03/16

On Fri, 16 Mar 2001, W. Kent Starr wrote:

[#12655] Re: FEATURE REQUEST: 'my' local variables — "Benjamin J. Tilly" <ben_tilly@...>

>===== Original Message From Leo Razoumov <see_signature@127.0.0.1> =====

18 messages 2001/03/14

[#12706] Library packaging — "Nathaniel Talbott" <ntalbott@...>

I have a project that I'm working on that needs to live two different lives,

30 messages 2001/03/16

[#12840] Looking for a decent compression scheme — Dave Thomas <Dave@...>

14 messages 2001/03/19

[#12895] differences between range and array — "Doug Edmunds" <dae_alt3@...>

This code comes from the online code examples for

16 messages 2001/03/20
[#12896] Re: differences between range and array — "Hee-Sob Park" <phasis@...> 2001/03/20

[#12899] Re: differences between range and array — Jim Freeze <jim@...> 2001/03/20

On Tue, 20 Mar 2001, Hee-Sob Park wrote:

[#12960] TextBox ListBox — Ron Jeffries <ronjeffries@...>

Attached is a little Spike that Chet and I are doing. It is a

13 messages 2001/03/20

[#12991] [ANN] Lapidary 0.2.0 — "Nathaniel Talbott" <ntalbott@...>

Well, here's my first major contribution to the Ruby world: Lapidary. It's a

16 messages 2001/03/20

[#13028] mkmf question — Luigi Ballabio <luigi.ballabio@...>

15 messages 2001/03/21

[#13185] Reading a file backwards — "Daniel Berger" <djberg96@...>

Hi all,

21 messages 2001/03/25
[#13197] Re: Reading a file backwards — "Daniel Berger" <djberg96@...> 2001/03/25

> Hi Dan,

[#13203] Re: Reading a file backwards — Mathieu Bouchard <matju@...> 2001/03/25

On Sun, 25 Mar 2001, Daniel Berger wrote:

[#13210] Re: Reading a file backwards — "Daniel Berger" <djberg96@...> 2001/03/25

"Mathieu Bouchard" <matju@sympatico.ca> wrote in message

[#13374] Passing an array to `exec'? — Lloyd Zusman <ljz@...>

I'd like to do the following:

15 messages 2001/03/31

[#13397] Multidimensional arrays and hashes? — Lloyd Zusman <ljz@...>

Is it possible in ruby to make use of constructs that correspond to

14 messages 2001/03/31

[ruby-talk:13367] Re: f.call (x) revisited

From: "Henry T. So Jr." <henryso@...>
Date: 2001-03-30 22:52:12 UTC
List: ruby-talk #13367
In "Doug Edmunds" [ruby-talk:13363], <dae_alt3@juno.com> wrote:
> > a = 1 ; x = 1 ; f = proc {|a| a += 1}
> > f.call(x)
> > f.call(a)
> > a # results in 2 <<<???? SEE NOTE BELOW
>
> > a = 1 ; x = 1 ; f = proc {|a| a += 1}
> > f.call(a)
> > f.call(x)
> >a # results in 3 <<<??? SEE NOTE BELOW
>
> I decided to try out his example.  I didn't get his results.
> I got 3 for the first result and 2 for the second.
> I have expanded the examples to try to see what is going on.
> I leave it to the group to explain:

This is all basically due to the scoping in Ruby.  By the time the closure is encountered, the variable a has already been established as having scope outside the block.

In Ruby, the scope of local variables (that is, those variables without punctuation as in $a, @a, or @@a) inside blocks is such that any variables in existence before the block is encountered maintain their existence (and scope), and any variables not in existence before the block is encountered are local to the block (even if they are made to exist after the block is encountered).

> a) why f.call(x) is always 2

By calling f.call(x), you are calling f.call(1).  The "|a|" part of the block makes the implicit assignment "a = 1".  This alters the value of a outside the block since the scope of a is outside the block.  Then the block is executed and a is incremented.  Thus, a, after calling the closure, has a value of 2 (and will always have a value of 2 because x was 1).

> b) why f.call(a) is always 3 after f.call(x)

Continuing from the above statement, after f.call(x), a has a value of 2.  When you then call f.call(a), you are calling f.call(2).  The "|a|" part of the block makes the implicit assignment "a = 2".  This alters the value of a outside the block (although a was already 2, so there is no apparent change).  When the block is executed, a is incremented, resulting in the value 3.

> c) where the value of a is coming from in proc {|a| a += 1} 

a is assigned to upon entering the block because of the |a| declaration.  This block has the side effect (in this example) of altering the a outside the block because the scope of a has been established outside the block (and in fact, the a inside the block is the a outside the block).

Consider this:

a = 1; x = 1; f = proc {|c| c += 1}
f.call(a) # => 2
f.call(x) # => 2
a # => 1
x # => 1
c # => not defined

and this

a = 1; x = 1; c = 1; f = proc {|c| c += 1}
f.call(a) # => 2   (same as c = a; c += 1)
f.call(x) # => 2   (same as c = x; c += 1)
a # => 1
x # => 1
c # => 2

In the first example, c is not defined before the closure is encountered, so changing c in the closure has no effect outside the closure.  In the second example, c is defined before the closure is encountered, so changing c in the closure has the effect of altering the c outside the closure.

The important thing to remember is that blocks and closures are not the same as methods.  They, by definition, have an effect based on the "environment" in which they were encountered.  Methods, on the other hand, are more independent of the "environment" in which they are encountered.

Understanding this may be one of the steps to fully appreciating Ruby's "harmony".

Cheers,
Henry.

In This Thread

Prev Next