Hi --

On Sat, 6 Jan 2007, Chris Gernon wrote:

> I thought calling a method without a receiver (i.e. name, name=) within
> an instance method would always call that method on the current object.
> Is this not true for setters (i.e. Thingy#name=)?

It is not true for setters.  The way it works is that when the parser
sees:

   bareword = ...

it defines bareword as a local variable.  Therefore, you always need
an explicit receiver for that kind of method, so Ruby will know it's a
method.

There are some interesting side-effects from this.  For example:

   if false
     a = 1
   end

   puts a   # nil

Even though "a = 1" is never executed, it's picked up by the parser,
and a gets defined.  That's why "puts a" doesn't raise an "unknown
method or local variable" error.

> Additionally, why is the first instance of name interpreted as a method
> call and the last instance interpreted as (I think) a local variable?

If both are defined, the local variable takes precedence.  You can
force method interpretation with parentheses:

   name()

but of course in practice it's better not to reuse the names.


David

-- 
Q. What is THE Ruby book for Rails developers?
A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black)
    (See what readers are saying!  http://www.rubypal.com/r4rrevs.pdf)
Q. Where can I get Ruby/Rails on-site training, consulting, coaching?
A. Ruby Power and Light, LLC (http://www.rubypal.com)