Newbie: Reflection question(?)


#1

At runtime I have the name of a class in a string, and I want to call a
method on the class having that name. How do I do that?

E.g., let’s say that we have several classes that all have a method
called address().
At run-time I know I want to call the method address() on a particular
class, and that class name is in a string.

Thanks.
G


#2

Gaudi Mi wrote:

At runtime I have the name of a class in a string, and I want to call a
method on the class having that name. How do I do that?

E.g., let’s say that we have several classes that all have a method
called address().
At run-time I know I want to call the method address() on a particular
class, and that class name is in a string.

you need to look at call

eg to instantiate an object (call Object.new)

m = c.method(:new)
o = m.call

to call address method

m = c.method(:address)
m.call

Kev


#3

I’ll try that, thanks Kev!

G

Kev J. wrote:

Gaudi Mi wrote:

At runtime I have the name of a class in a string, and I want to call a
method on the class having that name. How do I do that?

E.g., let’s say that we have several classes that all have a method
called address().
At run-time I know I want to call the method address() on a particular
class, and that class name is in a string.

you need to look at call

eg to instantiate an object (call Object.new)

m = c.method(:new)
o = m.call

to call address method

m = c.method(:address)
m.call

Kev


#4

On Fri, 2006-03-17 at 13:55 +0900, Gaudi Mi wrote:

At runtime I have the name of a class in a string, and I want to call a
method on the class having that name. How do I do that?

Here are two possible ways:

str = “Array”

=> “Array”

ary_clz = eval(str)

=> Array

ary_clz.class

=> Class

ary_clz.new

=> []

##################

ary_clz = Object.const_get(str)

=> Array

ary_clz.new

=> []


#5

“Ross B.” removed_email_address@domain.invalid wrote in message
news:removed_email_address@domain.invalid…

=> Array

=> Array

ary_clz.new

=> []

const_get is definitely preferred as it doesn’t show the same security
risks as eval does.

Addtional note, for nested class names:

name.split(/::/).inject(Object) {|cl,n| cl.const_get(n)}.address()

Kind regards

robert

#6

On 17 Mar 2006, at 05:01, Kev J. wrote:

you need to look at call

eg to instantiate an object (call Object.new)

m = c.method(:new)
o = m.call

I don’t think that’s going to work for him (if c is the
name_of_class_string that he’s got). He needs to look up the class
named name_of_class_string:

ObjectSpace.const_get(name_of_class_string).new(*any_arguments)

I’d like to check that is the “right way” to do it, but I don’t have
any reference books to hand.