Asp Forum
Home
|
Login
|
Register
|
Search
Forums
>
comp.lang.ruby
Dynamic class instantiation
Jason
1/19/2006 9:05:00 PM
Hi all,
I have a situation where I need to dynamically execute an object from a
String name. I read in pickaxe that as long as a capitalize the class
name in the string, Ruby will see it as a Constant and thusly allow me
to use it.
For example:
module Test
class MyClass
def do_something
puts "Something done."
end
end
end
(caller code)
cls = "Test::MyClass"
require cls
obj = cls.new
obj.do_something
------
When I execute the above caller code, I get an error saying
undefined method `new' for "Test::MyClass":String (NoMethodError)
So, obviously, Ruby is telling me that there is no new method for the
String "Test::MyClass". I'm trying to instantiate the class this way as
I have specific methods that return object besides String, so I'm
guessing eval(cls) isn't appropriate for me. Also, I checked the
archives on the list with no luck.
Any suggestions?
Thx,
- jason
--
Posted via
http://www.ruby-...
.
3 Answers
Ara.T.Howard
1/19/2006 9:12:00 PM
0
Jason
1/19/2006 9:23:00 PM
0
unknown wrote:
>
> def klass_stamp(hierachy, *a, &b)
> ancestors = hierachy.split(%r/::/)
> parent = Object
> while((child = ancestors.shift))
> klass = parent.const_get child
> parent = klass
> end
> klass::new(*a, &b)
> end
>
>
> class A; class B;end; end
>
> klass_stamp 'A::B'
>
> hth.
>
> -a
Actually, I just found this, which is a little simpler, but looks like
it does the same :)
mod = Module
name.split(/::/).each {|m| mod = mod.const_get(m) }
m = mod.new
# Call my method
m.do_something
Thx,
- jason
--
Posted via
http://www.ruby-...
.
Eric Hodel
1/19/2006 9:34:00 PM
0
On Jan 19, 2006, at 1:23 PM, Jason wrote:
> unknown wrote:
>>
>> def klass_stamp(hierachy, *a, &b)
>> ancestors = hierachy.split(%r/::/)
>> parent = Object
>> while((child = ancestors.shift))
>> klass = parent.const_get child
>> parent = klass
>> end
>> klass::new(*a, &b)
>> end
>>
>>
>> class A; class B;end; end
>>
>> klass_stamp 'A::B'
>>
>> hth.
>>
>> -a
>
> Actually, I just found this, which is a little simpler, but looks like
> it does the same :)
>
> mod = Module
> name.split(/::/).each {|m| mod = mod.const_get(m) }
> m = mod.new
def Object.path2class(path) # matches a C method that is not exported
into Ruby
return path.split('::').inject(Object) { |k,n| k.const_get n }
end
m = Object.path2class('Test::MyClass').new
> # Call my method
> m.do_something
--
Eric Hodel - drbrain@segment7.net -
http://se...
This implementation is HODEL-HASH-9600 compliant
http://trackmap.rob...
Servizio di avviso nuovi messaggi
Ricevi direttamente nella tua mail i nuovi messaggi per
Dynamic class instantiation
Inserendo la tua e-mail nella casella sotto, riceverai un avviso tramite posta elettronica ogni volta che il motore di ricerca troverà un nuovo messaggio per te
Il servizio è completamente GRATUITO!
x
Login to ForumsZone
Login with Google
Login with E-Mail & Password