From: Robert Klemme Date: 2009-04-03T15:49:31+09:00 Subject: Re: Class in a Class problem On 03.04.2009 06:02, matt neuburg wrote: > wrote: > >> My intent is to create a class that has access to call a method in an >> instantiation of another class >> >> However my knowledge of Ruby classes (Ok classes in general) is >> somewhat lacking >> >> The example below is a LOT simplified But I need class B to call a >> method within an instantiation of class A's. >> >> one alternative is to seperate the classes and then just do "b=B.new >> (a)" but I think that looks really messy and >> - I have then to check a bunch of stuff about the parameter a >> - I would have a world of more hurt trying to ensure that only one B >> instantiation pointed to each a >> >> Can anyone help? Or tell me that I am doing this all wrong. >> >> >> Paul >> >> ----- >> >> class A >> class B >> def initialize() >> puts "b init" >> print_stuff() >> end >> end >> >> def B >> return B >> end >> >> def print_stuff() >> puts "here" >> end >> end >> >> a = A.new() >> b = a.B.new() > > Maybe I'm reading your question wrong, but the concept "has access to > call" is misleading, it seems to me, since there is never lack of access > in Ruby. So what you're really asking, I'm guessing, is that when a B > instance is produced by an A instance, it should point to that A > instance. We can do that without even giving the B class a name: > > class A > def b > Class.new do > def initialize(a) > @a = a > end > attr :a > end.new(self) > end > # other stuff that an A knows how to do > end You are creating new classes all the time. I don't think this is a good idea. I am not sure what the OP really wants, if I'm not mistaken he wants to prevent creation of B instances outside of A and also make sure there is a 1:1 relationship between an A and a B instance. First of all, the question is: why are they separated? We can't answer that one from those abstract classes presented. Hiding of class B for the outside could be done like this: class A @b = Class.new do def print_stuff puts "hoho" end end def initialize @b = self.class.instance_variable_get("@b").new @b.print_stuff end end a = A.new p a But a) this is not really hidden and b) this looks quite ugly. Paul, what are you trying to accomplish? Kind regards robert