7
votes

Liste des méthodes de métaprogramming rubis?

Je viens de commencer à apprendre des métaprogramming rubis. Regarder l'objet.Methods I Obtenir:

Object.methods => [
:allocate, 
:new, 
:superclass, 
:freeze, 
:===, 
:==, 
:<=>, 
:<, 
:<=, 
:>, 
:>=, 
:to_s, 
:included_modules, 
:include?, 
:name, 
:ancestors, 
:instance_methods, 
:public_instance_methods, 
:protected_instance_methods, 
:private_instance_methods, 
:constants, 
:const_get, 
:const_set, 
:const_defined?, 
:const_missing, 
:class_variables, 
:remove_class_variable, 
:class_variable_get, 
:class_variable_set, 
:class_variable_defined?, 
:module_exec, 
:class_exec, 
:module_eval, 
:class_eval, 
:method_defined?, 
:public_method_defined?, 
:private_method_defined?, 
:protected_method_defined?, 
:public_class_method, 
:private_class_method, 
:autoload, 
:autoload?, 
:instance_method, 
:public_instance_method, 
:nil?, 
:=~, 
:!~, 
:eql?, 
:hash, 
:class, 
:singleton_class, 
:clone, 
:dup, 
:initialize_dup, 
:initialize_clone, 
:taint, 
:tainted?, 
:untaint, 
:untrust, 
:untrusted?, 
:trust, 
:frozen?, 
:inspect, 
:methods, 
:singleton_methods, 
:protected_methods, 
:private_methods, 
:public_methods, 
:instance_variables, 
:instance_variable_get, 
:instance_variable_set, 
:instance_variable_defined?, 
:instance_of?, 
:kind_of?, 
:is_a?, 
:tap, 
:send, 
:public_send, 
:respond_to?, 
:respond_to_missing?, 
:extend, 
:display, 
:method, 
:public_method, 
:define_singleton_method, 
:__id__, 
:object_id, 
:to_enum, 
:enum_for, 
:equal?, 
:!, 
:!=, 
:instance_eval, 
:instance_exec, 
:__send__]


1 commentaires

Si MetaProgramming Ruby est un intérêt sérieux, je vous recommande fortement le Book Ruby MetaProGrumming par Paolo Perrotta .


3 Réponses :


8
votes

Voici la meilleure réponse de Ce Page:

Crochets liés à la méthode strong> p>

coerce
induced_from
to_xxx


1 commentaires

Notez que ce sont d'excellents crochets, mais n'incluent pas de choses comme instance_eval ou définir_method .



5
votes

objet est une classe, la plupart des méthodes que vous avez répertoriées sont en réalité des méthodes d'instance de classe . Regardez aussi à objet.private_methods - Vous trouverez définir_method là-bas, ce qui est absolument essentiel. Mais Binding est très puissant aussi ... Lorsque vous apprenez à propos de Ruby MetaProgramming, vous voudrez examiner les docs pour la catégorie liant . Le envoyer , __ envoyer __ et public_send la famille est également essentiel.

En regardant la liste ci-dessus, vous devriez être capable d'identifier les méthodes "réflexion" qui peuvent être utilisées pour interroger et manipuler les constantes, les méthodes, les variables d'instance, etc. Ensuite, il y a le eval et exec méthodes. Méthode_MISSING est l'un des premiers que vous apprenez, mais faites attention à const_missing aussi. Assurez-vous de vérifier set_trace_func et trace_var . Et où serions-nous sans alias et alias_method ?

alors il y a l'interpréteur "hameçons" comme méthody_added , méthod_removed , méthod_undefinefin , hérité , étendu , inclus , singleton_method_added , singleton_method_removed , singleton_method_undefined , instance_method_added , instance_method_removed et instance_method_undefined .

Methode d'objet est essentiel pour obtenir méthode objets. Regardez toutes les méthodes de méthode , y compris des éléments tels que propriétaire . Le noyau # appelant peut être utile parfois. Ensuite, recherchez également la classe ObjectSpace .

Comprenez que bien qu'ils aient un comportement spécial, des classes et des modules ne sont que des objets et vous pouvez les créer de manière dynamique, les stocker dans des structures de données, etc. Ils n'ont même pas besoin d'avoir des noms. Vous pouvez simplement appeler class.new pour en faire un nouveau et utiliser class_eval , définir_method , etc., au besoin pour y ajouter des méthodes. < / p>

__ ligne __ et __ fichier __ peut être intéressant, en particulier fichier.read (__ fichier __) . .

Comprendre les blocs et la Lambdas bien est important à la fois pour la programmation générale de rubis et pour le métaprogramming en particulier.


0 commentaires

2
votes

Dans le livre "MetaProgramming Ruby", l'auteur indique qu'il n'y a pas de ligne ferme entre les métaprogramming et la programmation. Tout simplement la programmation.

Quelques exemples que je peux penser qui sont quelque peu intermédiaires entre la programmation et le métaprogramming sont class et attr_reader . .


0 commentaires