Robert Klemme
2/28/2006 3:53:00 PM
dblack@wobblini.net wrote:
> Hi --
>
> On Tue, 28 Feb 2006, Robert Klemme wrote:
>
>> rubyrus wrote:
>>> Can anybody help me here, TIA!!
>>>
>>> This is the code. I expect to see the string "Afterward:turkey",
>>> but why am I getting "Afterward:camel"? |animal| parameter in a
>>> block should be temporary inside the block, right??
>>
>> No, it isn't because it was defined outside the block. It's used in
>> cases like
>>
>> count = 0
>> arr.each { count += 1 }
>> puts "count=#{count}"
>>
>> If you want to keep it local you must not define it in the
>> surrounding scope.
>
> I think that's a different thing, though, from the parameter
> semantics. As I understand it, in 2.0 things would work like this:
Is there a difference with regard to scope between
(1..10).each {|foo| }
and
(1..10).each { foo = 1 }
? I think in both cases foo is limited to the block:
16:51:56 [~]: ruby -e 'def f() (1..5).each {|foo|}; foo end; f'
-e:1:in `f': undefined local variable or method `foo' for main:Object
(NameError)
from -e:1
16:51:59 [~]: ruby -e 'def f() (1..5).each {foo=1}; foo end; f'
-e:1:in `f': undefined local variable or method `foo' for main:Object
(NameError)
from -e:1
16:52:04 [~]:
Note, I'm not talking about Ruby 2.
> count = 0
> other = "zero"
> [1,2,3].each {|other| count += 1 }
>
> # count is now 3
> # other is still "zero"
>
> I may be getting it wrong... but I think the scoping of parameter
> variables and other block variables is going to diverge.
That's why I stick to the status quo - I lost track of this discussion
somewhere. But I trust Matz to do it properly. At least all relevant
arguments seem to have been exchanged. :-)
Kind regards
robert