Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

result of assignment is not the return value

392 views
Skip to first unread message

Nathan Beyer

unread,
Mar 11, 2010, 6:55:25 PM3/11/10
to
Given a simple class like this

class MyClass
attr_reader :value
def value=(val)
@value = val.to_s
end
end

Why the the following code return the value passed and not the value
assigned?

c = MyClass.new
result = c.value = 2
puts result
puts c.value

This is currently outputing

2
"2"

The results are the same when MyClass is modified to be this.

class MyClass
attr_reader :value
def value=(val)
@value = val.to_s
return @value
end
end

Shouldn't the result of the 'value=' method be the return value?

Tony Arcieri

unread,
Mar 11, 2010, 6:57:50 PM3/11/10
to
[Note: parts of this message were removed to make it a legal post.]

Setters always return the value they were originally assigned


--
Tony Arcieri
Medioh! A Kudelski Brand

Yukihiro Matsumoto

unread,
Mar 11, 2010, 7:03:02 PM3/11/10
to
Hi,

In message "Re: result of assignment is not the return value"


on Fri, 12 Mar 2010 08:55:25 +0900, Nathan Beyer <nbe...@gmail.com> writes:

|Shouldn't the result of the 'value=' method be the return value?

It's a design choice. We defined the value of the assignment as the
value of the right hand expression, not the return value from the
assigning method.

matz.

Nathan Beyer

unread,
Mar 11, 2010, 10:39:07 PM3/11/10
to

Ahh. Thanks. I figured it was something like that, but I couldn't find
any concrete reference to it.

>
>

Hal Fulton

unread,
Mar 12, 2010, 2:30:24 AM3/12/10
to
[Note: parts of this message were removed to make it a legal post.]

I have thought about this for awhile. One rationalization is this.

Think of "stacked assignment" which Ruby borrows from C.

x = y = 5

An accessor acts much like a simple assignment:

x = foo.bar = 5 # same as: x = (foo.bar = 5)

In this case, it would be weird if x ended up being anything
other than 5.


Hal

0 new messages