[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Newbie: Reflection question(?

Gaudi Mi

3/17/2006 4:56:00 AM

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


5 Answers

Kev Jackson

3/17/2006 5:01:00 AM

0

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


Gaudi Mi

3/17/2006 5:11:00 AM

0

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


Ross Bamford

3/17/2006 7:46:00 AM

0

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

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



Robert Klemme

3/17/2006 11:08:00 AM

0


"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

benjohn

3/18/2006 12:46:00 AM

0


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

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.