Result of assignment is not the return value

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?

Setters always return the value they were originally assigned

On Thu, Mar 11, 2010 at 6:03 PM, Yukihiro M. [email protected]
wrote:

                            matz.

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

Hi,

In message “Re: result of assignment is not the return value”
on Fri, 12 Mar 2010 08:55:25 +0900, Nathan B. [email protected]
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.

On Thu, Mar 11, 2010 at 9:39 PM, Nathan B. [email protected] wrote:

any concrete reference to it.

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