[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Dynamic class names

Martin Boese

4/2/2008 9:18:00 AM

Is it possible to create classes with a dynamic name? Example:

name = "Test"

class name # this fails
def write
puts "TEST"
end
end

puts Object::const_get(name).new.write # => "TEST"


4 Answers

Phillip Gawlowski

4/2/2008 9:59:00 AM

0

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Martin Boese wrote:
| Is it possible to create classes with a dynamic name? Example:
|
| name = "Test"
|
| class name # this fails
| def write
| puts "TEST"
| end
| end
|
| puts Object::const_get(name).new.write # => "TEST"
|
|
|
Yes. Here is an overview on metaprogramming, and two ways to create
classes dynamically:

http://ola-bini.blogspot.com/2006/09/ruby-metaprogramming-techn...

- -- Phillip Gawlowski
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail....

iEUEARECAAYFAkfzWNEACgkQbtAgaoJTgL9KhACfY0UzhdcpPeOYMYaOgjfUpT35
dAwAl3hEZTSDs6+M6U0givW4nk68iGU=
=44gD
-----END PGP SIGNATURE-----

Martin Boese

4/2/2008 11:03:00 AM

0

No... I mean the 'Name' of a class or module (that what you get with
object.class.name). The doc of Class::new (ri) describes how it works:

> You can give a class a name by assigning the class object to a constant.

...but still that doesn't allow me to set the initial name when _defining_ the
class.

I am aware that this can be done using eval with the complete class definition
as a string - which is also not what I want.

The reason is to avoid name clashes of a larger program. So I am thinking of
using some central instance to assign names and address specific types of
classes.

Martin



On Wednesday 02 April 2008 10:58:52 Phillip Gawlowski wrote:
> Martin Boese wrote:
> | Is it possible to create classes with a dynamic name? Example:
> |
> | name = "Test"
> |
> | class name # this fails
> | def write
> | puts "TEST"
> | end
> | end
> |
> | puts Object::const_get(name).new.write # => "TEST"
>
> Yes. Here is an overview on metaprogramming, and two ways to create
> classes dynamically:
>
> http://ola-bini.blogspot.com/2006/09/ruby-metaprogramming-techn...
>
> -- Phillip Gawlowski



Robert Dober

4/2/2008 11:20:00 AM

0

On Wed, Apr 2, 2008 at 11:18 AM, Martin Boese <boesemar@gmx.de> wrote:
> Is it possible to create classes with a dynamic name? Example:
>
> name = "Test"
>
> class name # this fails
> def write
> puts "TEST"
> end
> end
>
> puts Object::const_get(name).new.write # => "TEST"
>
>
>
sure

c = Class::new {
def a; 41 end
}
d = Class::new(c) {
def a; super.succ end
}
d.new.a --> 42

HTH
Robert


--
http://ruby-smalltalk.blo...

---
Whereof one cannot speak, thereof one must be silent.
Ludwig Wittgenstein

Martin Boese

4/2/2008 12:16:00 PM

0


Thanks, that's what I was looking for.

That example of mine now works:

name = 'Test'
Object::const_set(name.intern, Class::new do
def write
puts "TEST"
end
end
)
Object::const_get(name).new.write # writes => "TEST"

martin


On Wednesday 02 April 2008 12:19:33 Robert Dober wrote:
> On Wed, Apr 2, 2008 at 11:18 AM, Martin Boese <boesemar@gmx.de> wrote:
> > Is it possible to create classes with a dynamic name? Example:
> >
> > name = "Test"
> >
> > class name # this fails
> > def write
> > puts "TEST"
> > end
> > end
> >
> > puts Object::const_get(name).new.write # => "TEST"
>
> sure
>
> c = Class::new {
> def a; 41 end
> }
> d = Class::new(c) {
> def a; super.succ end
> }
> d.new.a --> 42
>
> HTH
> Robert