On Jun 7, 2:15 pm, "Rick DeNatale" <rick.denat... / gmail.com> wrote:
> On 6/7/07, Todd A. Jacobs <tjacobs-sndr-019... / codegnome.org> wrote:
>
> > On Thu, Jun 07, 2007 at 01:55:23PM +0900, Ivan Salazar wrote:
>
> > > This one is a very common mistake when someone is new to functional
> > > languages specially when having some procedural language experience...
> > > Many methods in functional languages don't have side effects (don't
>
> > Thanks. In retrospect, this is somewhat obvious. But you're right: it
> > was my expectation that foo.succ was equivalent to foo+=1, rather than
> > simply being an expression that returned a value without modifying the
> > variable itself.
>
> May I have the temerity to point out that there's another subtle
> misconception in this statement which I see a lot of Ruby nubies trip
> up on, and that's thinking that variables are objects.
>
> An object holds state and behavior, a variable references an object.
> More than one variable can reference the same object.
>
> Modifying an object means modifying the objects state.
>
> Modifying a variable means changing WHICH object it is referencing.
> Which is done by assignment or assignment-like things such as
> providing a value to the parameter of a method or block.
>
> I would argue that: a = a.chop! doesn't change the variable a since
> it's still referring to the same object.  Consider:
>
>      a = "abc"
>     # changes (sets) VARIABLE a
>
>      b = a
>      # changes (sets) VARIABLE b
>
>      p a.object_id  => -606250168
>      p b.object_id  => -606250168
>      # note that its one OBJECT referenced by two VARIABLES
>
>      c = a.delete('a')  => "bc"
>      # creates a new OBJECT leaving both VARIABLEs
>      # and the OBJECT they reference unchanged.
>      p a => "abc"
>      p b => "abc"
>      p a.object_id  => -606250168
>      p b.object_id  => -606250168
>
>      b.delete!('b')
>      # changes the state of the OBJECT referenced by VARIABLE b
>      p b => "ac"
>
>      p b.object_id  => -606250168
>     # but leaves the VARIABLE b unchanged, it's still referencing the same
>     # object albeit that object's state has changed.
>      p a => "ac"
>      p a.object_id  => -606250168
>     # and VARIABLE a still refers to the same (changed) OBJECT
>
>      b = c
>      # changes the VARIABLE b
>      p b.object_id => -606269188
>      p c.object_id => -606269188
>
> And variable is a general term covering (local|global|instance|class)
> variables as well as things like the slots in Arrays which refer to
> the elements of the array.
>
> --
> Rick DeNatale
>
> My blog on Rubyhttp://talklikeaduck.denhaven2.com/


I agree with you, that is also a frequent misconception.

>In brief, to modify an object you make a call to a method with
>side effects or reassign the object to the new one created after the method
>call.

The one above should read: "or reassign the variable to the new object
created".
(I don't know what happened, maybe I got confused while writing or it
was just
my good-old stupidity XD)