Nested classes

G

Groleo Marius

hi list.

I have the following code:

#! /usr/bin/ruby


class B
def fun_b
p "B"
end
end

class A
b =3D B.new
end

a =3D A.new
a.b.fun_b

The part that bugs me is this error:
/test.rb:15: undefined method `b' for #<A:0xb7cafb24> (NoMethodError)

What is the way to code the above ideea, so that the last line would be cor=
rect.

I'm running ruby 1.8.3 (2005-09-21) [i486-linux].


--
Regards, Groleo!

# Use "Reply to All" on mailing lists.
# touch universe
# chmod +x universe
# ./universe
 
B

Brian Schröder

hi list.

I have the following code:

#! /usr/bin/ruby


class B
def fun_b
p "B"
end
end

class A
b =3D B.new
end

a =3D A.new
a.b.fun_b

The part that bugs me is this error:
./test.rb:15: undefined method `b' for #<A:0xb7cafb24> (NoMethodError)

What is the way to code the above ideea, so that the last line would be c= orrect.

I'm running ruby 1.8.3 (2005-09-21) [i486-linux].

What problem do you want to solve?

Is this maybe nearer to you goals:

class A
class B
def fun_b
p "B"
end
end
end

A::B.new.fun_b

cheers,

Brian
 
P

Pit Capitain

Groleo said:
class B
def fun_b
p "B"
end
end

class A
b = B.new
end

a = A.new
a.b.fun_b

The part that bugs me is this error:
./test.rb:15: undefined method `b' for #<A:0xb7cafb24> (NoMethodError)

What is the way to code the above ideea, so that the last line would be correct.

Maybe this is what you want:

class A
attr_reader :b
def initialize
@b = B.new
end
end

Note that here each instance of A has its own instance of B, which might
not be what you want.

Regards,
Pit
 
G

Groleo Marius

What problem do you want to solve?

Is this maybe nearer to you goals:

class A
class B
def fun_b
p "B"
end
end
end

A::B.new.fun_b

cheers,

Brian

Consider the case when class B would have more member functions.
In your example I would have to create a new object for each call to a
B function.
OTOH, a solution that I dont like :) could be :
class A
class B
def fun_b
p "B"
end
def other_b
p "_B"
end
end
end
b =3D A::B.new
b.fun_b
b.other_b

By the instantion of a new B object in the code from the first post,
and refering to it, I was searching to keep a hierarchy inside a
network protocol.
I couldn't find any hint on google though :(



--
Regards, Groleo!

# Use "Reply to All" on mailing lists.
# touch universe
# chmod +x universe
# ./universe
 
B

Brian Schröder

Consider the case when class B would have more member functions.
In your example I would have to create a new object for each call to a
B function.
OTOH, a solution that I dont like :) could be :
class A
class B
def fun_b
p "B"
end
def other_b
p "_B"
end
end
end
b =3D A::B.new
b.fun_b
b.other_b

By the instantion of a new B object in the code from the first post,
and refering to it, I was searching to keep a hierarchy inside a
network protocol.
I couldn't find any hint on google though :(

Maybe you should look at the delegation pattern. That may be
applicable here. But I have not yet understood your use case. Could
you describe it in a bit more detail?

regards,

Brian
 
G

Groleo Marius

Maybe you should look at the delegation pattern. That may be
applicable here. But I have not yet understood your use case. Could
you describe it in a bit more detail?

Sure.
Consider a client script that has to querry a server.
The server operate on users/domains of a running qmail.

So, I would have a class named Client, with the folowing members:
login( user, pass ) logins to the remote administration server
domain an instantion of a domain class.

OTOH Domain class has X member functions:
add( domain_name) adds a new domain
remove
update

So a scenario would look like:

c =3DClient.new #creates a new Domain object
c.login( "foo", "bar" )
c.domain.add( "localdomain" )

Now , back to the code ,the attr_reader was the magic word from what
Pit posted .
Maybe you too observed, but why in ruby
this attr_reader : b is different from attr_reader :b
^space ^no space



--
Regards, Groleo!

# Use "Reply to All" on mailing lists.
# touch universe
# chmod +x universe
# ./universe
 
B

Brian Schröder

Sure.
Consider a client script that has to querry a server.
The server operate on users/domains of a running qmail.

So, I would have a class named Client, with the folowing members:
login( user, pass ) logins to the remote administration server
domain an instantion of a domain class.

OTOH Domain class has X member functions:
add( domain_name) adds a new domain
remove
update

So a scenario would look like:

c =3DClient.new #creates a new Domain object
c.login( "foo", "bar" )
c.domain.add( "localdomain" )

Now , back to the code ,the attr_reader was the magic word from what
Pit posted .
Maybe you too observed, but why in ruby
this attr_reader : b is different from attr_reader :b
^space ^no space

Because :b is the symbol :b while : b is a colon followed by a b which
is not allowed syntax here.

cheers,

Brian
 
L

Lloyd Zusman

Groleo Marius said:
[ ... ]

Now , back to the code ,the attr_reader was the magic word from what
Pit posted .
Maybe you too observed, but why in ruby
this attr_reader : b is different from attr_reader :b
^space ^no space

Because colon-identifier represents a symbol, and attr_reader takes
symbols as arguments. The colon is not a separator. For example:]

attr_reader :a, :b, :c

Each of :a, :b, and :c are symbols.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,968
Messages
2,570,152
Members
46,697
Latest member
AugustNabo

Latest Threads

Top