From: Gary Wright Date: 2009-07-24T01:00:05+09:00 Subject: Re: How to get real reference to an object? On Jul 23, 2009, at 10:25 AM, Pavel Smerk wrote: > >> You're (almost) always dealing in references in Ruby. (And the almost >> part doesn't affect you much anyway.) Every reference is exactly one >> step away from the object; there's no such thing as a reference to a >> reference. It's very different from Perl in that respect. > > Mhm, an unfortunate difference, I'm afraid... > > [...] >>> Morover, why the return value of the assignment is not an l-value? >>> The following is legal in Perl ($x ||= 1) *= 2 --- why it is not >>> legal in Ruby as well? >> I assume it's because (x ||= 1) evaluates to the object 1, and 1 *= 2 >> doesn't make sense. > > I know, my question is, why it does not evaluate to x. Then it would > have the same value (the value of x) and moreover it could stand on > the left side of an another assignment (as the x *= 2 does make > sense). It doesn't evaluate to x because Ruby isn't Perl. It isn't like there is an absolute right or wrong way to design a language. Each language has its own idioms and techniques, some of which are not translatable from one language to the next. > $ ruby -e 'h = { :a => { :b => "hi" } }; tmp = h[:a][:b]; tmp << " > there"; p h' > {:a=>{:b=>"hi there"}} > > which is OK, but not for Float: > > $ ruby -e 'h = { :a => { :b => 5.0 } }; tmp = h[:a][:b]; tmp += 5.0; > p h' > {:a=>{:b=>5.0}} > > And that's why I'm asking for a "real" reference, because tmp > apparently is not any kind of reference to the h[:a][:b]. Variables in Ruby hold references to objects. They are not labels for memory where values are stored. Your example should be written as: h[:a][:b] += 5.0 Gary Wright