Iterators and Assigment

G

Godspeed

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?

Thanks in advance.
 
R

Robert Klemme

Godspeed said:
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
 
J

Jonathan Leighton

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
 
G

Godspeed

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,584
Members
45,077
Latest member
SangMoor21

Latest Threads

Top