Forum: Ruby Iterators and Assigment

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
9044c38e7b09c418483b61109f3fa1af?d=identicon&s=25 Godspeed (Guest)
on 2006-02-28 14:23
(Received via mailing list)
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.
5befe95e6648daec3dd5728cd36602d0?d=identicon&s=25 Robert Klemme (Guest)
on 2006-02-28 14:39
(Received via mailing list)
Godspeed wrote:
>
> 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
9d4ec8946f933a18a1d15b094cc3c425?d=identicon&s=25 Jonathan Leighton (Guest)
on 2006-03-01 03:42
(Received via mailing list)
On Tue, 2006-02-28 at 22:38 +0900, Robert Klemme wrote:
> > puts "outside fred #{$k}"
> 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
9044c38e7b09c418483b61109f3fa1af?d=identicon&s=25 Godspeed (Guest)
on 2006-03-01 13:23
(Received via mailing list)
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" <lists@turnipspatch.com> wrote in message
news:1141149129.8908.8.camel@localhost.localdomain...
This topic is locked and can not be replied to.