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?

Tizian T. wrote:

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

Tizian T. wrote:

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

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

Thank you very much!

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, 2007 5:21 AM, Tizian T. [email protected] 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/

On Nov 21, 2007, at 4:02 PM, [email protected] 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/