Dynamically call classes

Discussion in 'Ruby' started by Tizian Taz, Nov 20, 2007.

  1. Tizian Taz

    Tizian Taz Guest

    Hello,

    I'm new to Ruby but have got several years of experience with PHP. I
    work on a project with several classes witch analyse text blocks. The
    blocks begin with headers like "Status" or "Update" but that's not my
    problem.

    I'd like to call classes dynamically like this :

    var = 'Status'
    # and now I want to call the class "Status"

    How can I manage it?
    --
    Posted via http://www.ruby-forum.com/.
     
    Tizian Taz, Nov 20, 2007
    #1
    1. Advertising

  2. Tizian Taz

    Peter Szinek Guest

    Tizian Taz wrote:
    > Hello,
    >
    > I'm new to Ruby but have got several years of experience with PHP. I
    > work on a project with several classes witch analyse text blocks. The
    > blocks begin with headers like "Status" or "Update" but that's not my
    > problem.
    >
    > I'd like to call classes dynamically like this :
    >
    > var = 'Status'
    > # and now I want to call the class "Status"
    >
    > How can I manage it?


    >> Kernel.const_get('Status')

    => Status

    cheers,
    Peter
    ___
    http://www.rubyrailways.com
    http://scrubyt.org
     
    Peter Szinek, Nov 20, 2007
    #2
    1. Advertising

  3. Tizian Taz

    Tizian Taz Guest

    Ok, but now, how can I access for example the method Hello which this
    existing class inheritated from his mother-class?

    I ask this because "Status.Hello" doesn't work...

    Maybe I wasn't clear enough in my description :

    The classes that I want to call all exist but I don't want to make a
    huge amount of tests to know which I have to call. Tell me if I'm not
    clear :S

    --
    Posted via http://www.ruby-forum.com/.
     
    Tizian Taz, Nov 20, 2007
    #3
  4. Tizian Taz

    Tizian Taz Guest

    Tizian Taz, Nov 20, 2007
    #4
  5. Tizian Taz

    Peter Szinek Guest

    Tizian Taz wrote:
    > Ok, but now, how can I access for example the method Hello which this
    > existing class inheritated from his mother-class?
    >
    > I ask this because "Status.Hello" doesn't work...
    >
    > Maybe I wasn't clear enough in my description :
    >
    > The classes that I want to call all exist but I don't want to make a
    > huge amount of tests to know which I have to call. Tell me if I'm not
    > clear :S
    >


    class Animal
    def ooze
    puts "oooooo"
    end

    def Animal.winkle
    puts "winkle"
    end
    end

    class Dog < Animal
    end

    Kernel.const_get("Dog").new.ooze
    Kernel.const_get("Dog").winkle


    HTH,
    Peter
    ___
    http://www.rubyrailways.com
    http://scrubyt.org
     
    Peter Szinek, Nov 20, 2007
    #5
  6. On Nov 20, 2007 5:21 AM, Tizian Taz <> wrote:
    > Ok, but now, how can I access for example the method Hello which this
    > existing class inheritated from his mother-class?
    >
    > I ask this because "Status.Hello" doesn't work...
    >
    > Maybe I wasn't clear enough in my description :
    >
    > The classes that I want to call all exist but I don't want to make a
    > huge amount of tests to know which I have to call. Tell me if I'm not
    > clear :S


    You can do this, and others are already helping. but...

    Do you really have a firm requirement to use a string to represent the class.

    Why not just:

    var = Status

    ...

    var.Hello

    Classes in Ruby are objects and variables can be used to refer to them.


    --
    Rick DeNatale

    My blog on Ruby
    http://talklikeaduck.denhaven2.com/
     
    Rick DeNatale, Nov 20, 2007
    #6
  7. Tizian Taz

    Guest

    And with this, you can do the var = Kernel.const_get("ClassName") and
    you have a reference to that class for the scope of your operation.

    On Nov 20, 5:37 am, "Rick DeNatale" <> wrote:
    > On Nov 20, 2007 5:21 AM, Tizian Taz <> wrote:
    >
    > > Ok, but now, how can I access for example the method Hello which this
    > > existing class inheritated from his mother-class?

    >
    > > I ask this because "Status.Hello" doesn't work...

    >
    > > Maybe I wasn't clear enough in my description :

    >
    > > The classes that I want to call all exist but I don't want to make a
    > > huge amount of tests to know which I have to call. Tell me if I'm not
    > > clear :S

    >
    > You can do this, and others are already helping. but...
    >
    > Do you really have a firm requirement to use a string to represent the class.
    >
    > Why not just:
    >
    > var = Status
    >
    > ...
    >
    > var.Hello
    >
    > Classes in Ruby are objects and variables can be used to refer to them.
    >
    > --
    > Rick DeNatale
    >
    > My blog on Rubyhttp://talklikeaduck.denhaven2.com/
     
    , Nov 21, 2007
    #7
  8. Tizian Taz

    ara.t.howard Guest

    On Nov 21, 2007, at 4:02 PM, wrote:

    > And with this, you can do the var = Kernel.const_get("ClassName") and
    > you have a reference to that class for the scope of your operation.


    imho const_get is just to fragile for most uses, i prefer something
    like this:



    cfp:~ > cat a.rb
    class Class
    def self.for string
    value =
    Thread.new do
    $SAFE = 4
    eval string.to_s, TOPLEVEL_BINDING.dup
    end.value
    raise ArgumentError unless value.is_a? Class
    value
    end
    end

    p Class.for('File::Stat')
    p Class.for('Foo::Bar')



    cfp:~ > ruby a.rb
    File::Stat
    a.rb:6:in `eval': (eval):1: uninitialized constant Foo (NameError)
    from a.rb:4:in `value'
    from a.rb:4:in `for'
    from a.rb:14



    a @ http://codeforpeople.com/
    --
    we can deny everything, except that we have the possibility of being
    better. simply reflect on that.
    h.h. the 14th dalai lama
     
    ara.t.howard, Nov 22, 2007
    #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. David

    Classes within classes

    David, Jul 21, 2005, in forum: ASP .Net
    Replies:
    2
    Views:
    4,959
    David
    Jul 22, 2005
  2. lonelyplanet999
    Replies:
    1
    Views:
    2,233
    VisionSet
    Nov 13, 2003
  3. Carfield Yim
    Replies:
    1
    Views:
    1,451
    Andrew Thompson
    May 31, 2004
  4. Razvan
    Replies:
    11
    Views:
    923
    Andrew Thompson
    Jul 17, 2004
  5. Razvan
    Replies:
    5
    Views:
    11,316
    Dale King
    Jul 27, 2004
Loading...

Share This Page