> sean / chittenden.org wrote:
> > dblack pointed out a better test case to use:
> > 
> > # Begin
> > class Foo
> >   def a=(b)
> >     return(4)
> >   end
> > end
> > 
> > f = Foo.new
> > p f.a = 5
> > p f.a = 10000
> > # end
> > 
> > Any ideas?  The output is:
> > 
> > 5
> > 10000
> 
> It's a recent change.  See the thread from [ruby-core:644].
> 
> Now an assignment expression always return the assigned value,
> regardless its implementation.

I have read the thread and I think this is a pretty bad change.  I
can't find an instance where this would be the desired result.  When
every other expression in Ruby evaluates from right to left, why do
assignment statements always have a value of the right most value?
This breaks some of my unit tests with what I can only describe as a
"unique feature" that only Ruby has.  :-/

Here's a practical example from libxml.  libxml uses zlib for
compressing XML documents.  If you assign a value to
XML::Document#compression that is greater than 9, or less than 0, the
value used for the compression is set to either 9 or 0, respectively.

Therefore, in my unit tests I do:

assert_equal(0, doc.compression = -5)
assert_equal(9, doc.compression = 100000)

But with the way that things are now, I have to do the following:

assert_equal(-5, doc.compression = -5)
assert_equal(0, doc.compression)

assert_equal(1000, doc.compression = 1000)
assert_equal(9, doc.compression)

Which seems very counter intuitive.  If = is method (=()), then the
return value of the method should be determined by the =() method and
not by the virtue that = is an assignment operator.  Remember, from
the example above that f.a = 5 is the same as writing f.a=(5).  I
expect the f.a=() method to return whatever value f.a=() returns and
not that it will always default to the value being passed in.

Is there any chance this behavior can be reviewed further?  -sc

-- 
Sean Chittenden