Nested classes

Discussion in 'Ruby' started by Groleo Marius, Nov 16, 2005.

  1. 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
    Groleo Marius, Nov 16, 2005
    #1
    1. Advertising

  2. On 16/11/05, Groleo Marius <> wrote:
    > 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

    --
    http://ruby.brian-schroeder.de/

    Stringed instrument chords: http://chordlist.brian-schroeder.de/
    Brian Schröder, Nov 16, 2005
    #2
    1. Advertising

  3. Groleo Marius

    Pit Capitain Guest

    Groleo Marius schrieb:
    >
    > 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
    Pit Capitain, Nov 16, 2005
    #3
  4. On 11/16/05, Brian Schr=F6der <> wrote:
    >
    > 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
    Groleo Marius, Nov 16, 2005
    #4
  5. On 16/11/05, Groleo Marius <> wrote:
    > On 11/16/05, Brian Schr=F6der <> wrote:
    > >
    > > 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 :(
    >


    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

    --
    http://ruby.brian-schroeder.de/

    Stringed instrument chords: http://chordlist.brian-schroeder.de/
    Brian Schröder, Nov 16, 2005
    #5
  6. On 11/16/05, Brian Schr=F6der <> wrote:
    > On 16/11/05, Groleo Marius <> wrote:
    > > On 11/16/05, Brian Schr=F6der <> wrote:
    > > >
    > > > 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 :(
    > >

    >
    > 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
    Groleo Marius, Nov 16, 2005
    #6
  7. On 16/11/05, Groleo Marius <> wrote:
    > On 11/16/05, Brian Schr=F6der <> wrote:
    > > On 16/11/05, Groleo Marius <> wrote:
    > > > On 11/16/05, Brian Schr=F6der <> wrote:
    > > > >
    > > > > 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 :(
    > > >

    > >
    > > 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
    >


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

    cheers,

    Brian

    --
    http://ruby.brian-schroeder.de/

    Stringed instrument chords: http://chordlist.brian-schroeder.de/
    Brian Schröder, Nov 16, 2005
    #7
  8. Groleo Marius

    Lloyd Zusman Guest

    Groleo Marius <> writes:

    > [ ... ]
    >
    > 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.


    --
    Lloyd Zusman

    God bless you.
    Lloyd Zusman, Nov 16, 2005
    #8
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Razvan
    Replies:
    5
    Views:
    11,282
    Dale King
    Jul 27, 2004
  2. kelvSYC
    Replies:
    2
    Views:
    584
    Chris Smith
    Aug 18, 2004
  3. Russ Perry Jr
    Replies:
    2
    Views:
    4,104
    Russ Perry Jr
    Aug 20, 2004
  4. Tony Johansson

    Nested classes within other classes

    Tony Johansson, Dec 14, 2004, in forum: C++
    Replies:
    2
    Views:
    469
    msalters
    Dec 14, 2004
  5. Chad E. Dollins
    Replies:
    3
    Views:
    648
    Kai-Uwe Bux
    Nov 8, 2005
Loading...

Share This Page