Feature #10570
closedAllow `+=` etc. to be methods
Description
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, foo.bar += x
is equivalent to foo.send('bar=', foo.send('bar').send('+', x))
, which requires that the return value of foo.bar
implements #+
and that foo
implements #bar=
. If this related feature were implemented, foo.bar += x would be equivalent to
foo.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?