2010-08-07 8 views
1

Je crée des classes non-nommées dynamiquement.Où créer des classes dynamiquement? Dans l'objet ou dans l'espace de noms global?

J'ai vu un exemple où cette création se fait dans la classe de l'objet:

class Object 

    for elem in ARRAY 
    sub_class = Object.const_set(elem.to_s.camelize, Class.new(SuperClass)) 

    sub_class.class_eval do 
     def initialize(*args, &block) 
     ... 
     super *args, &block 
     end 
    end 
    end 

end 

Mes questions:

  • évalueriez-vous aussi cela dans le contexte de l'objet?
  • Où est la différence par rapport à la création de classes dans l'espace de noms global?
  • Des avantages ou des inconvénients?

Répondre

2

Intéressant. Lors de certaines expérimentations, appeler SomeConstant.const_set à partir de différents contextes ne fait aucune différence, donc l'appeler à l'intérieur du bloc class Object est le même que de le définir dans l'espace de noms de premier niveau.

En outre: tout ce qui est dans l'espace de noms global est implicitement défini dans la classe Object, il est donc redondant. Le seul avantage que je peux voir [en le définissant dans une classe différente, ou dans le module Kernel] est que la constante sera disponible pour toutes les classes, et la chaîne de recherche regardera la classe Object avant le module Kernel.

+0

Ah, d'accord. En ce qui concerne votre dernière phrase: ma question était de savoir si la définition dans 'Object' est avantageuse par rapport à l'espace de noms toplevel. Donc, il sera disponible pour toutes les classes de toute façon. Ainsi, la ligne du bas est: * Il n'y a aucune différence * (comme l'espace de noms global signifie implicitement l'espace de noms d'objet). – crispy