Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1529 connectés 

  FORUM HardWare.fr
  Programmation
  Ruby/Rails

  Creation dynamique d'accesseurs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Creation dynamique d'accesseurs

n°1906982
esox_ch
Posté le 20-07-2009 à 20:41:56  profilanswer
 

Bonjour,
 
Ce que j'essaie de faire est "simple". J'ai une classe ElementsController, cette classe est héritée par plein de monde et elle contient plein de routines utilisées sous forme "directe" ou via spécialisation par ses classes filles.
Ce que je veux c'est que chaque classe fille (par exemple FilleController) obtienne des accesseurs "à son nom" sans que je doive les définir explicitement dans chaque classe (sinon je vais les oublier et pis c'est moche).
 
Donc j'aimerais que FilleController ait une variable d'instance @fille qui soit crée et accessible (comme si je faisais un attr_accessor :fille quoi)
 
J'ai tenté de faire la chose suivante mais ça ne marche pas :
 

Code :
  1. class ElementsController < ApplicationController
  2.  
  3.  attr_accessor self.to_s.demodulize.gsub('Controller','').downcase.singularize.to_sym
  4.  
  5. ...
  6. end
  7.  
  8. class FilleController < ElementsController
  9. end


 
Mais si je fais un  
 

Code :
  1. f = FilleController.new
  2. f.fille = "Je suis une fille"


 
Bein ça ne marche pas ...
 

Citation :


NoMethodError: undefined method `fille=' for #<FilleController:0xb711b6e4>
 from (irb):3


Quelqu'un voit le pourquoi? Sinon vous croyez qu'il y a mieux/plus simple? Parce que je trouve quand même pas super joli comme truc :heink:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
mood
Publicité
Posté le 20-07-2009 à 20:41:56  profilanswer
 

n°1907000
masklinn
í dag viðrar vel til loftárása
Posté le 20-07-2009 à 21:10:28  profilanswer
 

Ton attr_accessor est exécuté une seule fois dans le contexte de ElementsController [:spamafote]

 

Faut faire ton bricolage au niveau de la métaclasse (la classe dont ton ElementsController est une instance).

 

edit: http://whytheluckystiff.net/articl [...] early.html et si c'est pas suffisant, google.


Message édité par masklinn le 20-07-2009 à 21:12:08

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1907009
esox_ch
Posté le 20-07-2009 à 22:00:51  profilanswer
 

Voilà c'est exactement sur ce genre de truc que j'ai des lacunes :D
Bon bein merci, je vais chercher de la doc parce que là son  
 

Code :
  1. class Object
  2.   # The hidden singleton lurks behind everyone
  3.   def metaclass; class << self; self; end; end
  4.   def meta_eval &blk; metaclass.instance_eval &blk; end
  5.  
  6.   # Adds methods to a metaclass
  7.   def meta_def name, &blk
  8.     meta_eval { define_method name, &blk }
  9.   end
  10.  
  11.   # Defines an instance method within a class
  12.   def class_def name, &blk
  13.     class_eval { define_method name, &blk }
  14.   end
  15. end


 
J'y comprend juste absolument rien. :jap:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1907010
masklinn
í dag viðrar vel til loftárása
Posté le 20-07-2009 à 22:07:40  profilanswer
 

esox_ch a écrit :

Voilà c'est exactement sur ce genre de truc que j'ai des lacunes :D
Bon bein merci, je vais chercher de la doc parce que là son

 
Code :
  1. class Object
  2.   # The hidden singleton lurks behind everyone
  3.   def metaclass; class << self; self; end; end
  4.   def meta_eval &blk; metaclass.instance_eval &blk; end
  5.  
  6.   # Adds methods to a metaclass
  7.   def meta_def name, &blk
  8.     meta_eval { define_method name, &blk }
  9.   end
  10.  
  11.   # Defines an instance method within a class
  12.   def class_def name, &blk
  13.     class_eval { define_method name, &blk }
  14.   end
  15. end
 

J'y comprend juste absolument rien. :jap:


Non mais faut lire le texte hein, ça c'est juste l'exemple initial "zomg magic happens here totoz", derrière il reprend tout de 0 [:petrus75]


Message édité par masklinn le 20-07-2009 à 22:07:55

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1907015
esox_ch
Posté le 20-07-2009 à 22:12:16  profilanswer
 

Oui oui j'ai vu qu'il reprend pas mal de notions par la suite (je suis même tombé sur un site plus "terre à terre" ( http://practicalruby.blogspot.com/ [...] ction.html ) que je suis en train de lire..
Mais y a des trucs que je comprend pas encore quand même..
 
Par exemple, pourquoi il ne fait pas juste?
 

Code :
  1. def meta_eval &blk; self.instance_eval &blk; end


 
Je capte pas la différence..


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1907131
esox_ch
Posté le 21-07-2009 à 11:19:28  profilanswer
 

Bon j'ai un peu avancé grâce à la doc que j'ai lue, mais reste que je comprend pas quelque chose  
 

Code :
  1. class Test
  2.        define_method(:fille){ "Je suis une fille" }
  3.        
  4.        class << self;self;end.instance_eval do
  5.                def mec
  6.                 "Je suis un mec"
  7.                end
  8.        end
  9. end
  10.  
  11.  
  12. test = Test.new
  13. p test.fille
  14. p test.mec


 
Pourquoi test.mec n'existe pas?
Parce que le truc du define_method est bien ce que je cherche, mais malheureusement j'ai pas trouvé comment remplacer le  
 

Code :
  1. def fille= nom
  2. @fille =  nom
  3. end

 
par un define_method (J'ai l'impression qu'on peut pas lui passer de paramètres, c'est exact? :heink:)
 
Edit :  
 
Je viens de tester la chose suivante :
 

Code :
  1. test = Test.new
  2. p test.fille
  3.  
  4. class << test
  5.                def mec= name
  6.                 @mec = name
  7.                end
  8.                def mec
  9.                 @mec
  10.                end
  11. end
  12. test.mec = "Jean"
  13. p test.mec


 
Et bien entendu ça marche ... Mais comment enfermer ça directement dans la classe?


Message édité par esox_ch le 21-07-2009 à 11:32:55

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1907144
esox_ch
Posté le 21-07-2009 à 11:37:49  profilanswer
 

Bon je suis arrivé à faire marcher le "mec". En fait suffit d'utiliser un class_eval  
 

Code :
  1. class Test
  2.        define_method(:fille){ "Je suis une fille" }
  3.        
  4.        class_eval do
  5.  
  6.                def mec= name
  7.                 @mec = name
  8.                end
  9.                def mec
  10.                 @mec
  11.                end
  12.        end
  13. end


 
Mais ça ne résous pas pour autant mon problème de pouvoir définir leur nom "à la volée"  


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1907200
esox_ch
Posté le 21-07-2009 à 13:54:07  profilanswer
 

Bon,  
J'ai encore un peu avancé et j'arrive à faire définir mes méthodes "à la volée"  
 

Code :
  1. class Mother
  2.         define_method(self.to_s.downcase){ instance_variable_get '@'<<self.class.to_s.downcase }
  3.         define_method((self.to_s.downcase+'=').to_sym){|nom| instance_variable_set '@'<<self.class.to_s.downcase, nom}
  4. end
  5. class Daughter < Mother
  6. end


 
Le soucis c'est que ça me crée pas de fonction daugther, parce que c'est uniquement executé dans la classe mère  :bounce:  
Je vois vraiment pas comment changer ça  :sweat:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1907276
esox_ch
Posté le 21-07-2009 à 15:14:04  profilanswer
 

Bon j'ai trouvé la réponse sur la mailling list :o
 

Code :
  1. class Mother
  2.   def self.attr_eponymous(c=self)
  3.     c.send(:attr_accessor, c.to_s.downcase)
  4.   end
  5.  
  6.   def self.inherited(c)
  7.     attr_eponymous(c)
  8.   end
  9.  
  10.   attr_eponymous
  11. end
  12. class Daughter < Mother
  13. end


 
J'étais tellement focalisé sur toutes les histoires de singleton & co que j'ai oublié le hook self.inherited :heink:
Le seul "point noir" de cette méthode c'est que les classes définies dans la classe mère, sont héritées par la classe fille.. Je vais voir, si ça m'embête je passerai un coup de remove_method dans le tas :o
 
Merci à tous


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Ruby/Rails

  Creation dynamique d'accesseurs

 

Sujets relatifs
Creation de fichier composé de plusieurs autresBDD creation d'une application ou simple migration?
création d'un programme générant des nuages de point, et histogrammesCréation nouvelle application Sous Visual Studio
Erreur suite à la création d'une DLLCréation moteur de recherche alternatif
Bug sur Tableau croisy dynamiqueTable dynamique JPA/Hibernate
Quel est le coût de la création d'un objet ne contenant pas de donnée[javascript|jquery] affichage dynamique d'une image ds un div
Plus de sujets relatifs à : Creation dynamique d'accesseurs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR