[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Method behaviour

Sard Aukary

8/6/2006 8:38:00 PM

Some methods like

def change(word)
word[0]='e'
end
a="affluent"
puts a
change(a)
puts a

alter the original object outside of the method, where as others don't.

def change(word)
word="fish"
end
a="cow"
puts a
change(a)
puts a


Why the change in behaviour, what determines it? Is the only way I can
write methods that change the original object by using the Ruby methods
that do this?

--
Posted via http://www.ruby-....

4 Answers

Farrel Lifson

8/6/2006 8:46:00 PM

0

On 06/08/06, Sard Aukary <sardaukary@yahoo.co.uk> wrote:
> Some methods like
>
> def change(word)
> word[0]='e'
> end
> a="affluent"
> puts a
> change(a)
> puts a
>
> alter the original object outside of the method, where as others don't.
>
> def change(word)
> word="fish"
> end
> a="cow"
> puts a
> change(a)
> puts a
>
>
> Why the change in behaviour, what determines it? Is the only way I can
> write methods that change the original object by using the Ruby methods
> that do this?
>
> --
> Posted via http://www.ruby-....
>
>

In the second example you are changing the reference to where 'word'
points. You create a new string ('fish') and then set 'word' to
reference it. 'a' still points to your original word ('cow').

dblack

8/6/2006 8:49:00 PM

0

Morton Goldberg

8/7/2006 12:20:00 AM

0

Your assessment is correct but you got one detail wrong. The message
sent by

word[0]='e'

is actually []= with arguments 0 and 'e'. That is, the pseudo-
assignment is really the message

word.[]=(0, 'e')

As a coating of syntactic sugar, Ruby permits us to write this as
something that looks like an assignment and which, consequently, can
confuse people like the OP.

Regards, Morton

P.S. Don't think I'm complaining about the syntactic sugar: the real
message underlying the sugar coating is ugly. I don't want to write
stuff like that.

On Aug 6, 2006, at 4:48 PM, dblack@wobblini.net wrote:

> Hi --
>
> On Mon, 7 Aug 2006, Sard Aukary wrote:
>
>> Some methods like
>>
>> def change(word)
>> word[0]='e'
>> end
>> a="affluent"
>> puts a
>> change(a)
>> puts a
>>
>> alter the original object outside of the method, where as others
>> don't.
>>
>> def change(word)
>> word="fish"
>> end
>> a="cow"
>> puts a
>> change(a)
>> puts a
>>
>>
>> Why the change in behaviour, what determines it? Is the only way
>> I can
>> write methods that change the original object by using the Ruby
>> methods
>> that do this?
>
> It's because there's a distinction between (a) sending a message to an
> object, and (b) assigning to a variable.
>
> a = "cow" # assignment
> a[0] = 'w' # send message "[]" to a
> a = "fish" # assignment -- reusing the identifier 'a'
>
> Whenever you assign to a variable, you're wiping the slate clean: the
> variable loses all association with the object it referred to
> previously (if any).
>
> The "word[0] = 'e'" expression looks like assignment, but technically
> it's calling the method "[]=" on the object word, with the single
> argument 'e'. It's not the same as just plain assignment to an
> identifier.


dblack

8/7/2006 1:20:00 AM

0