Rick DeNatale <rick.denatale / gmail.com> wrote:

> On 10/26/06, matt neuburg <matt / tidbits.com> wrote:
> > bachase / gmail.com <bachase / gmail.com> wrote:
> >
> > > Consider:
> > >
> > > class BigGuy
> > >    def initialize
> > >       @favorites = ["a","b","c"]
> > >    end
> > >
> > >    class << self
> > >      def display_favs
> > >       class_eval "p @favorites"
> > >      end
> > >    end
> > > end
> > >
> > > class LittleGuy < BigGuy
> > >      display_favs
> > > end
> > >
> > > Why does this display "nil"?  I expected the initialize of BigGuy to
> > > occur prior to invoking display_favs.  Any other construction I should
> > > be using to get my desire behavior of the constructor of the base class
> > > getting called prior to singleton methods called from the child class?
> >
> > "Initialize" is called when the class is instantiated (i.e. with new).
> > You are never instantiating this class, so "initialize" is never called.
> 
> True, but kind of beside the point.

Perhaps it's a matter of pedagogy. What *is* "the point"? That depends
on where one thinks the OP has ultimately gone wrong. The OP might have
any of several misconceptions (it is hard to be certain); the OP might
not be aware:

(1) that initialize is called at instantiation time.

(2) that a class and an instance of that class are different things.

(3) that the singleton method is a class method.

(4) that the @favorites referred to in the class method is not the
@favorites referred to in "initialize".

Each of us is trying to teach, so each of us, like a good teacher, made
a guess about where the heart of the OP's misunderstanding might lie. I
guessed (1), with a little bit of (2) thrown in. You are leaning more
toward (3) and (4). Your guess is reasonable, but my guess is not
unreasonable, especially since the OP explicitly said: "I expected the
initialize ... to occur". I spoke to that issue, showing why that
expectation was wrong. So what I said is hardly "beside the point".

m.

> The initialize method if and when
> it is called will set the instance variable @favorites in a new
> INSTANCE of BigGuy.
>
> class BigGuy
>  ...
>   class << self
>     def display_favs
>      class_eval "p @favorites"
>     end
>   end
> end
> 
> This makes display_favs a class method of BigGuy.
> In the method display_favs self is the class object BigGuy.
> 
> so
>    class_eval "p @favorites"
> is the same as
>    BigGuy.class_eval "p @favorites"
> 
> which is printing a class instance variable of BigGuy which doesn't exist.
> 
> And...
> 
> class LittleGuy < BigGuy
>     display_favs
> end
> 
> inside this class definition, self is LittleGuy so
> 
>     display_favs
> is equivalent to:
>     LittleGuy.display_favs
> 
> which executes
>    BigGuy::display_favs
> 
> by inheritance
> 
> which prints the uninitialized class instance variable @favorites.
> 
> Note also that the class instance variable @favorite in BigGuy is
> different from the clas instance variable @favorite in LittleGuy,
> although neither one is initialized.


-- 
matt neuburg, phd = matt / tidbits.com, http://www.tidbits.com/matt/
Tiger - http://www.takecontrolbooks.com/tiger-customizing.html
AppleScript - http://www.amazon.com/gp/product/0596102119
Read TidBITS! It's free and smart. http://www.tidbits.com