From: Ivan Salazar Date: 2007-06-14T14:24:43+09:00 Subject: Re: Globals not incrementing inside block On Jun 7, 2:15 pm, "Rick DeNatale" wrote: > On 6/7/07, Todd A. Jacobs 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)