> 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