Method behaviour

S

Sard Aukary

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?
 
F

Farrel Lifson

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?

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').
 
D

dblack

Hi --

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.


David

--
http://www.rubypowerandlight.com => Ruby/Rails training & consultancy
----> SEE SPECIAL DEAL FOR RUBY/RAILS USERS GROUPS! <-----
http://dablog.rubypal.com => D[avid ]A[. ]B[lack's][ Web]log
http://www.manning.com/black => book, Ruby for Rails
http://www.rubycentral.org => Ruby Central, Inc.
 
M

Morton Goldberg

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.

Hi --

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.
 
D

dblack

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,039
Latest member
CasimiraVa

Latest Threads

Top