On 12/2/05, Chris Irish <chris.irish / libertydistribution.com> wrote:
> K.... I get it
> One more thing, Can I use the symbol to call a method and pass arguments
> to it?  Or is it just a reference to the methods name so that's not
> possible?

Sure thing. The symbol is not a reference to the method at all. What
the symbol is is a *key* into the objects method table, the value
corresponding to that key is the reference to the Method object. I can
use a symbol (it'll "auto-vivify", for lack of a better word) even
without a corresponding method.

As far as syntax for calling a method just using it's named symbol,
there are two ways you can do this. The first is to use send:

  class Greeter
    def hello( name )
      puts "Hello, #{name}!"
    end
  end

  greeter = Greeter.new
  greeter.send( :hello, "World" )
  # prints "Hello, World!"

An alternate technique is to grab an actual reference to the method
itself. This is available using the 'method' method:

  greeter = Greeter.new
  meth = greeter.method( :hello )
  meth.call( "World" )
  # same output

This latter approach allows you to perform the name lookup only once,
even if you need to call the method several times. It's also useful
when metaprogramming; you can grab a reference to an existing method
before redefining it, then call the original method from inside the
redefined method. Nifty!

Jacob Fugal