PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > comp.lang.ruby > Dynamic class names
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
Dynamic class names

Réponse
 
LinkBack Outils de la discussion
Vieux 02/04/2008, 10h18   #1
Martin Boese
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Dynamic class names

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"


  Réponse avec citation
Vieux 02/04/2008, 10h58   #2
Phillip Gawlowski
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Dynamic class names

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

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

iEUEARECAAYFAkfzWNEACgkQbtAgaoJTgL9KhACfY0UzhdcpPe OYMYaOgjfUpT35
dAwAl3hEZTSDs6+M6U0givW4nk68iGU=
=44gD
-----END PGP SIGNATURE-----

  Réponse avec citation
Vieux 02/04/2008, 12h02   #3
Martin Boese
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Dynamic class names

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...echniques.html
>
> -- Phillip Gawlowski




  Réponse avec citation
Vieux 02/04/2008, 12h19   #4
Robert Dober
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Dynamic class names

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.blogspot.com/

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

  Réponse avec citation
Vieux 02/04/2008, 13h15   #5
Martin Boese
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Dynamic class names


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




  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 17h44.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,11649 seconds with 13 queries