From: Godspeed Date: 2006-03-01T21:23:38+09:00 Subject: Re: Iterators and Assigment Thanks guys. Your responses have cleared this up. I was assumig some sort of substitution (of the block into the def) going on, but I realise it is the other way round, the parameters to yield are parameters to the block. Makes perfect sense now. "Jonathan Leighton" wrote in message news:1141149129.8908.8.camel@localhost.localdomain... > 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/ > > >