[[ warning : this is really simplified ]]

>>>>> "T" == Tobias Reif <tobiasreif / pinkjuice.com> writes:

T> What's the underlying concept here?

 POLS :-)

 Imagine that you are a beginner. Your first script probably will be

    def tt
       puts "Hello world"
    end
    tt

 i.e. you define what you call a "global function" and call it. You are
 happy because it work

 Your second script is

    def tt
       puts "Hello world"
    end
    class A
       def a
          tt
       end
    end
    A.new.a

 At this step you create a new class, and you learn that to call the method
 defined in this class you must first create an instance of this class.
 i.e. 'class A' just create a class, this mean that self can't make
 reference to an instance and fatally make reference to the class.

 Because you still think that tt is a "global function", you call it in the
 method A#a and you are happy because it work

 In reality "global function" don't exist in ruby, and tt is just a private
 method of Object.

 Your first 2 scripts work because
  * at toplevel, class is Object and self is an instance of Object
  * Object is the root of the hierarchy (i.e. A inherit from Object)


 Your third script probably will be to create a class method, and you'll
 see that when ruby create a class it also create automatically a
 metaclass. The instance methods are stored in the class, and the class
 methods are stored in the metaclass. This is why you can have a class
 method with the same name than an instance method.

 Finally one day you'll write

   a = A.new
   class << a
      def b
         puts "b"
      end
   end

 and you'll see that you can have also method specific to an object.


Guy Decoux