Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > how to create an object of a class you don't know yet

Reply
Thread Tools

how to create an object of a class you don't know yet

 
 
Bradley, Todd
Guest
Posts: n/a
 
      12-03-2004
Hi, I'm just now getting into Ruby's OO-ness, and could use some advice.
I'm trying to create an object, but which specific class needs to be
determined at runtime. I figured out how to do this by creating a
string and executing it using the "eval" command, but I know there must
be an easier way. My first guess was to do something like #{answer}.new
but that didn't work.


Here's my code:


class Foo
def method1
end
end

class Bar
def method2
end
end

# Pretend this was determined at runtime
answer = "Foo"


# There must be a better way of doing this:

myobj = Object.new # Needs to exist in this scope
mystring = "myobj = #{answer}.new"

eval mystring

puts "I just created a #{myobj.class} object."




Any advice is appreciated. Thanks in advance!


Todd.



 
Reply With Quote
 
 
 
 
Eric Hodel
Guest
Posts: n/a
 
      12-03-2004
On 03 Dec 2004, at 10:44, Bradley, Todd wrote:

> Hi, I'm just now getting into Ruby's OO-ness, and could use some
> advice.
> I'm trying to create an object, but which specific class needs to be
> determined at runtime. I figured out how to do this by creating a
> string and executing it using the "eval" command, but I know there must
> be an easier way. My first guess was to do something like
> #{answer}.new
> but that didn't work.
>
>
> Here's my code:
>
>
> class Foo
> def method1
> end
> end
>
> class Bar
> def method2
> end
> end
>
> # Pretend this was determined at runtime
> answer = "Foo"
>
>
> # There must be a better way of doing this:
>
> myobj = Object.new # Needs to exist in this scope
> mystring = "myobj = #{answer}.new"
>
> eval mystring
>
> puts "I just created a #{myobj.class} object."


klass = answer.split('::').inject(Object) { |klass,const|
klass.const_get const }

myobj = klass.new

In longer terms:

answer.split('::') # for Foo::Bar::Baz nested classes/modules

answer.split('::').inject(Object) do |klass, const| # namespaces start
from Object
klass.const_get const # #inject passes the value of this expression in
# as the first arg to the block, so use that namespace
# to find the next part of the namespace
end

klass = answer.split [...] # #inject returns the last result, which will
# be a class, provided answer references a class

myobj = klass.new # instantiate an instance of the class

You can also do things like this:

KLASSES = { 'html' => HTMLWriter, 'pdf' => PDFWriter, 'plain-text' =>
TextWriter }

output = ARGV.shift

raise "invalid output type" unless KLASSES.include? output

writer = KLASSES[output].new



 
Reply With Quote
 
 
 
 
Francis Hwang
Guest
Posts: n/a
 
      12-03-2004
"new" is just a class method, and you can call class methods on classes
that aren't bound at the time of interpretation. For example:

instance = MyClass.new

is the same as

a_class = MyClass
instance = a_class.new

So you can do things like:

irb(main):001:0> classes = [ String, Hash, Array ]
=> [String, Hash, Array]
irb(main):002:0> grab_bag = classes.collect { |a_class| a_class.new }
=> ["", {}, []]



On Dec 3, 2004, at 1:44 PM, Bradley, Todd wrote:

> Hi, I'm just now getting into Ruby's OO-ness, and could use some
> advice.
> I'm trying to create an object, but which specific class needs to be
> determined at runtime. I figured out how to do this by creating a
> string and executing it using the "eval" command, but I know there must
> be an easier way. My first guess was to do something like
> #{answer}.new
> but that didn't work.
>
>
> Here's my code:
>
>
> class Foo
> def method1
> end
> end
>
> class Bar
> def method2
> end
> end
>
> # Pretend this was determined at runtime
> answer = "Foo"
>
>
> # There must be a better way of doing this:
>
> myobj = Object.new # Needs to exist in this scope
> mystring = "myobj = #{answer}.new"
>
> eval mystring
>
> puts "I just created a #{myobj.class} object."
>
>
>
>
> Any advice is appreciated. Thanks in advance!
>
>
> Todd.
>
>


Francis Hwang
http://fhwang.net/



 
Reply With Quote
 
Daneel van Tonder
Guest
Posts: n/a
 
      12-04-2004
Bradley, Todd wrote:
> Hi, I'm just now getting into Ruby's OO-ness, and could use some advice.
> I'm trying to create an object, but which specific class needs to be
> determined at runtime. I figured out how to do this by creating a
> string and executing it using the "eval" command, but I know there must
> be an easier way. My first guess was to do something like #{answer}.new
> but that didn't work.
>
>
> Here's my code:
>
>
> class Foo
> def method1
> end
> end
>
> class Bar
> def method2
> end
> end
>
> # Pretend this was determined at runtime
> answer = "Foo"
>
>
> # There must be a better way of doing this:
>
> myobj = Object.new # Needs to exist in this scope
> mystring = "myobj = #{answer}.new"
>
> eval mystring
>
> puts "I just created a #{myobj.class} object."
>
>
>
>
> Any advice is appreciated. Thanks in advance!
>
>
> Todd.
>
>
>

class GMClassManager
@@classHash = { 'CLASS_ROOM_DEFAULT' => GMRoom,
'CLASS_ROOM_LOGIN' => GMLoginRoom,
}

def GMClassManager.getRoomObject( valueClassId )
tmpClass = @@classHash[ valueClassId ]
if not tmpClass == nil
tmpClass.new
else
nil
end
end
end


This works for me
 
Reply With Quote
 
Florian Gross
Guest
Posts: n/a
 
      12-04-2004
Daneel van Tonder wrote:

> class GMClassManager
> @@classHash = { 'CLASS_ROOM_DEFAULT' => GMRoom,
> 'CLASS_ROOM_LOGIN' => GMLoginRoom,
> }


Using a constant instead would be nicer, I think.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
don't like, so don't waste your time thinking and buy them. You know,if you don't like one thing, it means nothing for you.</p> fashion t shirts seller Cisco 0 06-13-2011 02:01 AM
If I have a String "Hello" and I know it is a name of a class, how to use it to create a object? fAnSKyer Java 10 10-02-2006 03:51 AM
Object creation - Do we really need to create a parent for a derieved object - can't the base object just point to an already created base object jon wayne C++ 9 09-22-2005 02:06 AM
I know, I know, I don't know Andries Perl Misc 3 04-23-2004 02:17 AM



Advertisments