From: Jonathan Leighton Date: 2006-03-01T11:42:05+09:00 Subject: Re: Iterators and Assigment On Tue, 2006-02-28 at 22:38 +0900, Robert Klemme wrote: > Godspeed wrote: > > Consider... > > > > def fred > > yield $k > > puts "in fred #{$k}" > > end > > > > $k=2 > > fred {|o| o = 3} > > puts "outside fred #{$k}" > > > > produces: > > > > in fred 2 > > outside fred 2 > > > > why is $k still 2 after the call to fred? > > Because Ruby does call by value where values are object references. Same > holds for blocks and their parameters. There is no implicit aliasing > between k$ and o. When the block is invoked you get a new reference which > initially points to the same instance as $k. Then you assign it and it > points to some other object leaving $k still pointing to the old instance. > > Kind regards > > robert So, try this: def fred $k = yield puts "in fred #{$k}" end $k = 2 fred { 3 } puts "outside fred #{$k}" Returns: in fred 3 outside fred 3 You can call yield with parameters if you need the value of $k to be accessible inside the block. Although $k is accessible inside the block anyway as it's a global. Although you're probably not using a global in your actual code. Regards -- Jonathan Leighton http://turnipspatch.com/ | http://jonathanleighton.com/ | http://digital-proof.org/