On 5/11/06, Philip Hallstrom <ruby / philip.pjkh.com> wrote:
> Stop thinking of =, ==, +, *, <=,.... as operators.  Think of them as
> methods.

Correct. Usually. As seen below, = sometimes is just an operator.
Others like ! are never methods. And some, like != and +=, are
translated into multiple operators/methods. E.g.

  # equivalent comparisons, you can't override != directly
  a != b
  !(a == b)
  !(a.==(b))

  # equivalent method calls
  foo.a += 1
  foo.a = foo.a + 1
  foo.a=(foo.a + 1)
  foo.a=(foo.a.+(1))

  # equivalent assignments
  a += 1
  a = a + 1
  a = a.+(1)

> So, when you see "a = b" that's really saying call the method "=" on the
> object "a" passing as an argument "b".  If you think of it that way then
> when you see the below method it will make more sense.
>
> def a= (b)
>    @a = b
> end

Not quite correct.

The = is translated by the parser into a method call only if the left
hand side has an explicit receiver:

  # equivalent method calls
  foo.a = b
  foo.a=(b)
  foo.send(:"a=", b)

But if the left hand side has no explicit receiver, the = is simply an
assignment operator to a local (or instance, or class instance)
variable:

  # direct assignments
  a = 5
  @a = 5
  @@a = 5

> So, "a + b" is really:
>
> def a+ (b)
>    return a + b
> end

Also not quite correct. a + b *is* always a method call, but the name
of the method is just "+". a is the receiver and b is the argument:

  # equivalent method calls
  a + b
  a.+(b)
  a.send(:"+", b)

Even with an explicit receiver on the left hand side, it's just a
matter of a method call on the *value* of the left hand side:

  # equivalent method calls
  foo.a + b
  foo.a.+(b)

  # *not* equivalent
  foo.send(:"a+", b)

As an aside, I don't think there's any syntax that would work for
invoking a method named "a+" other than using a direct send.

Jacob Fugal