On 3/22/06, Mark Volkmann <mkhan / lextranet.com> wrote:

> It's true that blocks introduce a new scope. However, if they use  
> variables that are in scope outside the block, they don't shadow  
> those variables, they use them.

about this block posted by Mohammad Khan

> batman = 'robin'
> [ 'cat', 'dog', 'horse', 'chicken' ].each { |batman| puts batman }
> puts "Now you might think this would say 'robin', but it says: # 
> {batman}"

where the last line outputs:

> Now you might think this would say 'robin', but it says: chicken

With no variable declarations in Ruby, there's no way to control the  
scope, so the "first occurrence dictates scope" rule applies to  
Mohammad's example. I think that this is counter intuitive. I think  
that the pipe operators should be treated analogously to the way that  
C++ treats declarations that occur within an expression; viz., they  
are scoped to the end of the block dependent upon the expression.

Specifically, in C++ you have this:

int i = 5;
for (int i = 0; i < 100; i++) ...
printf("i=%u\n", i);

vs

int i = 5;
for (i = 0; i < 100; i++) ...
printf("i=%u\n", i);

I contend that the pipe operators are most intuitively understood as  
being an example of the first type of operation and not the second.  
It's safer, in any case, not to use duplicate variable names. Perhaps  
I'm too comfortable with this sort of thing because of the deeply  
entrenched habits accumulated from a background primarily in C, C++,  
and (later) Java. In perl, this would require the use of a local  
scope, which I've always hated.

In any case, before I ran the script that Mohammad has posted here, I  
fully expected such a piece of code to behave like the first instance  
and not like the second. This would have caused a bug that would have  
been nearly impossible for me to find.

-------------------------------------------------------
   David King Landrith
    (w) 617.227.4469x213
    (h) 617.696.7133

   One useless man is a disgrace, two
   are called a law firm, and three or more
   become a congress   -- John Adams
-------------------------------------------------------
public key available upon request