Newbie: Reflection question(?)

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

···

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

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

Here are two possible ways:

str = "Array"
# => "Array"

ary_clz = eval(str)
# => Array

ary_clz.class
# => Class

ary_clz.new
# =>

···

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?

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

ary_clz = Object.const_get(str)
# => Array

ary_clz.new
# =>

--
Ross Bamford - rosco@roscopeco.REMOVE.co.uk

I'll try that, thanks Kev!

G

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

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

"Ross Bamford" <rossrt@roscopeco.co.uk> wrote in message news:1142581508.1295.3.camel@jukebox.roscopeco...

···

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

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

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.

···

On 17 Mar 2006, at 05:01, Kev Jackson 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