Obtaining a reference to an enclosing class of a nested class

Here is a nested class definition:

class A
  class B
  end
end

Now, if I have a reference to class B from somewhere:

def get_reference
end

reference_b = get_reference

How can I get a reference to the enclosing class A?

I can't do this by symbol lookup since class A (and B for that matter)
are anonymous. Am I going to have to explicitly create a
back-reference to the enclosing class at the time that I create class
B?

Thanks
-John
http://www.iunknown.com

···

A::B

Here is a nested class definition:

class A
  class B
  end
end

Now, if I have a reference to class B from somewhere:

def get_reference
  A::B
end

reference_b = get_reference

How can I get a reference to the enclosing class A?

Well in this case, since we know(?) it's a Class or Module:

   reference_b.name => "A::B"

So you can get A's name by string manipulation.

I can't do this by symbol lookup since class A (and B for that matter)
are anonymous. Am I going to have to explicitly create a
back-reference to the enclosing class at the time that I create class
B?

Do you really mean that they are anonymous, or that you don't directly
know the name?

···

On 8/30/06, John Lam <drjflam@gmail.com> wrote:

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

John Lam wrote:

Here is a nested class definition:

class A
class B
end
end

Now, if I have a reference to class B from somewhere:

def get_reference
A::B
end

reference_b = get_reference

How can I get a reference to the enclosing class A?

I can't do this by symbol lookup since class A (and B for that matter)
are anonymous. Am I going to have to explicitly create a
back-reference to the enclosing class at the time that I create class
B?

Thanks
-John
http://www.iunknown.com

class A
   class B
     @nesting = Module.nesting
     class << self; attr_reader :nesting; end
   end
end

p A::B.nesting # ==> [A::B, A]

However, you say the classes are anonymous. How are you getting B under
the scope of A in that case?

···

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

John Lam wrote:

Here is a nested class definition:

class A
class B
end
end

Now, if I have a reference to class B from somewhere:

def get_reference
A::B
end

reference_b = get_reference

How can I get a reference to the enclosing class A?

I can't do this by symbol lookup since class A (and B for that matter)
are anonymous. Am I going to have to explicitly create a
back-reference to the enclosing class at the time that I create class
B?

Thanks
-John
http://www.iunknown.com

class A
   class B
     @nesting = Module.nesting
     class << self; attr_reader :nesting; end
   end
end

p A::B.nesting # ==> [A::B, A]

However, you say the classes are anonymous. How are you getting B under
the scope of A in that case?

···

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Yep - they're anonymous. I'm rewriting how RubyCLR deals with shadow
class references to generic types, and I've made a design decision
that shadow classes don't really need names. The anonymous class
objects are bound to constants only when necessary (I could avoid this
too, but I haven't measured how expensive calls to const_missing vs. a
hit on a constant are - I suspect it's faster to have constants
pre-created).

I used to mangle class names so that:

List<String>

becomes

List_generic_System_String

but this becomes insanely complex when you consider all of the corner
cases involving generic types and nested generic types. I cut a ton of
complexity out of the code by simply not naming the classes anymore.
That works until this case.

Right now I'm explicitly adding a back-reference to the anonymous
class objects that I create which works just fine. I was just
wondering if there was something in the Ruby type system that would
let me do this already so that I'm not wasting memory duplicating
something that I can already do.

I'm fairly certain that I can't do this, but I thought I'd run it past
folks with more experience than me.

Cheers,
-John

···

On 8/30/06, Rick DeNatale <rick.denatale@gmail.com> wrote:

On 8/30/06, John Lam <drjflam@gmail.com> wrote:
> Here is a nested class definition:
>
> class A
> class B
> end
> end
>
> Now, if I have a reference to class B from somewhere:
>
> def get_reference
> A::B
> end
>
> reference_b = get_reference
>
> How can I get a reference to the enclosing class A?

Well in this case, since we know(?) it's a Class or Module:

   reference_b.name => "A::B"

So you can get A's name by string manipulation.

> I can't do this by symbol lookup since class A (and B for that matter)
> are anonymous. Am I going to have to explicitly create a
> back-reference to the enclosing class at the time that I create class
> B?

Do you really mean that they are anonymous, or that you don't directly
know the name?

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

However, you say the classes are anonymous. How are you getting B under
the scope of A in that case?

mod1 = Module.new
mod2 = nil
mod1.module_eval{ mod2 = Module.new }

···

On Aug 30, 2006, at 4:22 PM, Joel VanderWerf wrote:

--
      vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Logan Capaldo wrote:

However, you say the classes are anonymous. How are you getting B under
the scope of A in that case?

mod1 = Module.new
mod2 = nil
mod1.module_eval{ mod2 = Module.new }

I don't think mod2 is nested in mod1, in any sense. There's no reason for ruby to keep track of the modules that are created during the execution of the block that accompanies the mod1.module_eval call and to associate them with mod1. The only reason B is associated with A in

module A
   module B; end
end

is that they are lexically related. (More precisely the constant "B" is in the namespace belonging to the class A.)

Maybe someone else has a more definitive answer?

···

On Aug 30, 2006, at 4:22 PM, Joel VanderWerf wrote:

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Logan Capaldo wrote:

However, you say the classes are anonymous. How are you getting B under
the scope of A in that case?

mod1 = Module.new
mod2 = nil
mod1.module_eval{ mod2 = Module.new }

I don't think mod2 is nested in mod1, in any sense. There's no reason for ruby to keep track of the modules that are created during the execution of the block that accompanies the mod1.module_eval call and to associate them with mod1. The only reason B is associated with A in

module A
  module B; end
end

is that they are lexically related. (More precisely the constant "B" is in the namespace belonging to the class A.)

Maybe someone else has a more definitive answer?

VALUE rb_define_module_under(VALUE outer, const char *name)

You could use this to define a named module under an anonymous module.

···

On Aug 30, 2006, at 6:10 PM, Joel VanderWerf wrote:

On Aug 30, 2006, at 4:22 PM, Joel VanderWerf wrote:

--
      vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

But module nesting is namespace nesting, so what does it mean to put a
nameless object in a namespace?

···

On 8/30/06, Logan Capaldo <logancapaldo@gmail.com> wrote:

On Aug 30, 2006, at 6:10 PM, Joel VanderWerf wrote:

> Logan Capaldo wrote:
>> On Aug 30, 2006, at 4:22 PM, Joel VanderWerf wrote:
>>>
>>> However, you say the classes are anonymous. How are you getting B
>>> under
>>> the scope of A in that case?
>>>
>> mod1 = Module.new
>> mod2 = nil
>> mod1.module_eval{ mod2 = Module.new }
>
> I don't think mod2 is nested in mod1, in any sense. There's no
> reason for ruby to keep track of the modules that are created
> during the execution of the block that accompanies the
> mod1.module_eval call and to associate them with mod1. The only
> reason B is associated with A in
>
> module A
> module B; end
> end
>
> is that they are lexically related. (More precisely the constant
> "B" is in the namespace belonging to the class A.)
>
> Maybe someone else has a more definitive answer?
>

VALUE rb_define_module_under(VALUE outer, const char *name)

You could use this to define a named module under an anonymous module.

> --
> vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407
>

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

IPMS/USA Region 12 Coordinator
http://ipmsr12.denhaven2.com/

Visit the Project Mercury Wiki Site
http://www.mercuryspacecraft.com/

Rick DeNatale wrote:

But module nesting is namespace nesting, so what does it mean to put a
nameless object in a namespace?

It's the other way around: a named object in an unnamed namespace, using rb_define_module_under.

···

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Rick DeNatale wrote:
> But module nesting is namespace nesting, so what does it mean to put a
> nameless object in a namespace?

It's the other way around: a named object in an unnamed namespace, using
rb_define_module_under.

Except that the OP said that BOTH were anonymous. Pasting from the
original post:

···

On 8/30/06, Joel VanderWerf <vjoel@path.berkeley.edu> wrote:

I can't do this by symbol lookup since class A (and B for that matter)
are anonymous.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

Rick DeNatale wrote:
> But module nesting is namespace nesting, so what does it mean to put a
> nameless object in a namespace?

It's the other way around: a named object in an unnamed namespace, using
rb_define_module_under.

Except that the OP said that BOTH were anonymous. Pasting from the
original post:

I can't do this by symbol lookup since class A (and B for that matter)
are anonymous.

I was just pointing out ways something like that could possibly come to occur.

···

On Aug 31, 2006, at 8:26 AM, Rick DeNatale wrote:

On 8/30/06, Joel VanderWerf <vjoel@path.berkeley.edu> wrote:

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

No problem. I'm just trying to figure out what he want's to accomplish.

···

On 8/31/06, Logan Capaldo <logancapaldo@gmail.com> wrote:

On Aug 31, 2006, at 8:26 AM, Rick DeNatale wrote:

> On 8/30/06, Joel VanderWerf <vjoel@path.berkeley.edu> wrote:
>> Rick DeNatale wrote:
>> > But module nesting is namespace nesting, so what does it mean to
>> put a
>> > nameless object in a namespace?
>>
>> It's the other way around: a named object in an unnamed namespace,
>> using
>> rb_define_module_under.
>
> Except that the OP said that BOTH were anonymous. Pasting from the
> original post:
>
>> I can't do this by symbol lookup since class A (and B for that
>> matter)
>> are anonymous.
>
I was just pointing out ways something like that could possibly come
to occur.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/