On Jan 30, 2008, at 8:42 PM, Richard Everhart wrote:

> I need to do something like what is being attempted in the code below.
>
> The commented out code is what I can't figure out: how do methods in a
> nested classes call methods in their enclosing class?  Is this even
> possible?
>
> class Enclosing
>   def go
>     Hello.new.do_say_hello
>   end
>
>   def say_hello
>     "Hello World!"
>   end
>
>   class Hello
>     def do_say_hello
> #     puts Enclosing class's say_hello method
>     end
>   end
>
> end

This doesn't really make sense.  First of all nested classes are just  
a way to organize the *names* of classes.  The nesting is completely  
orthogonal to the inheritance hierarchy.  In your example,
Enclosing and Enclosing::Hello are only related by their name.   
Neither one is a subclass or parent of the other, they are both  
subclasses of Object.

The second issue is that those are instance methods so you'll need an  
instance of Enclosing and and instance of Hello before you can even  
think of calling Hello#do_say_hello or Enclosing#say_hello.

I'm not sure what you are after but you kind of have two choices.   
Make Hello a subclass of Enclosing, or make Enclosing a module and  
include its methods into Hello.  These examples below  will 'work'  
but they are awkward at best.  I'm not sure exactly what you are  
trying to do so I'm not sure what to suggest instead.


Subclass:

class Enclosing
   def go
     Hello.new.do_say_hello
   end

   def say_hello
     "Hello World!"
   end

   class Hello < Enclosing
     def do_say_hello
       puts say_hello
     end
   end

end

Enclosing.new.go


# Module

module Enclosing
   def go
     Hello.new.do_say_hello
   end

   def say_hello
     "Hello World!"
   end

   class Hello
     include Enclosing
     def do_say_hello
       puts say_hello
     end
   end

end

Enclosing::Hello.new.go