2012-02-28 15 views
6

Acabo de empezar a aprender la metaprogramación de Ruby. En cuanto a Object.methods me sale:Lista de métodos de metaprogramación de Ruby?

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__] 

¿Hay una lista de métodos que son útiles para metaprogramming? Tales como instance_eval, initialize y method_missing?

+3

Si la metaprogramación de Ruby es un interés serio, recomiendo encarecidamente el [Libro de metaprogramación Ruby] (http://pragprog.com/book/ppmetr/metaprogramming-ruby) de Paolo Perrotta. – sarnold

Respuesta

8

Aquí está la respuesta superior de la página this:

ganchos relacionados con el método

method_missing 
method_added 
singleton_method_added 
method_removed 
singleton_method_removed 
method_undefined 
singleton_method_undefined 

Clase & ganchos del módulo

inherited 
append_features 
included 
extend_object 
extended 
initialize_copy 
const_missing 

Marshalling Ganchos

marshal_dump 
marshal_load 

coerción Ganchos

coerce 
induced_from 
to_xxx 

Además, echa this entrada del blog de explicaciones y código de ejemplo para muchos de estos métodos.

+0

Tenga en cuenta que estos son grandes ganchos, pero no incluyen cosas como 'instance_eval' o' define_method'. – Phrogz

5

Object es una clase, por lo que la mayoría de los métodos enumerados son en realidad Class métodos de instancia. Mire también en Object.private_methods - encontrará define_method ahí, lo cual es absolutamente esencial. Pero binding es muy potente también ... cuando se aprenda acerca de la metaprogramación de Ruby, querrá consultar los documentos para la clase Binding. La familia send, __send__ y public_send también es esencial.

Al mirar la lista anterior, debe poder identificar los métodos de "reflexión" que se pueden usar para consultar y manipular constantes, métodos, variables de instancia, etc. programáticamente. Luego están los métodos eval y exec. method_missing es uno de los primeros que aprende, pero preste atención también a const_missing. Asegúrese de consultar set_trace_func y trace_var. ¿Y dónde estaríamos sin alias y alias_method?

Luego están los "ganchos" como intérprete method_added, method_removed, method_undefined, inherited, extended, included, singleton_method_added, singleton_method_removed, singleton_method_undefined, instance_method_added, instance_method_removed y instance_method_undefined.

Object#method es esencial para obtener objetos Method. Mire todos los métodos de Method, incluyendo cosas como owner. Kernel#caller puede ser útil a veces. Luego, también busque la clase ObjectSpace.

Comprenda que, aunque tienen un comportamiento especial, las clases y los módulos son solo objetos y puede crearlos dinámicamente, almacenarlos en estructuras de datos, etc. Ni siquiera tienen que tener nombres.Puede llamar al Class.new para hacer una nueva y usar class_eval, define_method, etc. según sea necesario para agregarle métodos.

__LINE__ y __FILE__ pueden ser interesantes, especialmente File.read(__FILE__).

Entender bloques y lambdas es importante tanto para la programación general de Ruby como para la metaprogramación en particular.

2

En el libro "Metaprogramación Ruby", el autor afirma que no hay una línea firme entre la metaprogramación y la programación. Todo es solo programación.

Algunos ejemplos que puedo pensar que son un poco de programación intermedia y metaprogramación son class y attr_reader.

Cuestiones relacionadas