Robert Klemme
4/3/2009 6:48:00 AM
On 03.04.2009 06:02, matt neuburg wrote:
> <denize.paul@gmail.com> 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