From: Robert Klemme Date: 2006-03-01T00:58:36+09:00 Subject: Re: Same variable name used in block and local question 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