Dynamically call classes

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

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

Don't care about what I said, it works fine!

Thank you very much!

···

--
Posted via http://www.ruby-forum.com/.

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

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.

···

On Nov 20, 2007 5:21 AM, Tizian Taz <tazmaniack@gmail.com> 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

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

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" <rick.denat...@gmail.com> wrote:

On Nov 20, 2007 5:21 AM, Tizian Taz <tazmani...@gmail.com> 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/

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/

···

On Nov 21, 2007, at 4:02 PM, jacob.dunphy@gmail.com 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.

--
we can deny everything, except that we have the possibility of being better. simply reflect on that.
h.h. the 14th dalai lama