Feature #10570

Allow `+=` etc. to be methods

Added by david_macmahon (David MacMahon) over 5 years ago. Updated over 5 years ago.

Target version:


In MRI, it is currently possible to create #+= methods in C extensions and even += aliases for existing methods in Ruby source code. These methods are only callable via #send('+=', ...) because the parser interprets a += b as a = a + b before the "operator method" is called. Thus, a += b is currently equivalent to a = a.send('+', b) rather than a.send('+=', b). This feature request is to allow and support <OP>= methods, where <OP> is any of Ruby's operators that can be defined as methods (e.g. #+, #-, etc).

A related feature request would be to allow #<attribute><op>= methods in addition to the already supported#<attribute>= methods. As it is now, += x is equivalent to foo.send('bar=', foo.send('bar').send('+', x)), which requires that the return value of implements #+ and that foo implements #bar=. If this related feature were implemented, += x would be equivalent tofoo.send('bar+=', x)`.

I guess this would be tricky to add in a backwards compatible way. What happens if #+= is not defined for the would-be receiver? How would that condition be detected in a way that could fall back to the old default behavior?

What other possible complications could make this request impractical?

Also available in: Atom PDF