2012-02-28 14 views
6

Appena iniziato a imparare a metaprogrammare Ruby. Guardando Object.methods ottengo:Elenco dei metodi di metaprogrammazione di 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__] 

Esiste un elenco di metodi che sono utili per metaprogrammazione? Ad esempio instance_eval, initialize e method_missing?

+3

Se metaprogramming Ruby è un interesse serio, consiglio vivamente il [libro Metaprogramming Ruby] (http://pragprog.com/book/ppmetr/metaprogramming-ruby) di Paolo Perrotta. – sarnold

risposta

8

Ecco la risposta in alto da this pagina:

Metodo relativi ganci

method_missing 
method_added 
singleton_method_added 
method_removed 
singleton_method_removed 
method_undefined 
singleton_method_undefined 

Classe & modulo Ganci

inherited 
append_features 
included 
extend_object 
extended 
initialize_copy 
const_missing 

Marshalling Ganci

marshal_dump 
marshal_load 

coercizione Ganci

coerce 
induced_from 
to_xxx 

Inoltre, controllare this post sul blog per spiegazioni e codice di esempio per molti di questi metodi.

+0

Si noti che questi sono ottimi hook, ma non includono cose come 'instance_eval' o' define_method'. – Phrogz

5

Object è una classe, quindi la maggior parte dei metodi elencati sono in realtà i metodi di istanza Class. Guarda anche Object.private_methods - troverai define_method lì, che è assolutamente essenziale. Ma anche lo binding è molto potente ... quando si apprende la metaprogrammazione di Ruby, ti consigliamo di consultare i documenti per la classe Binding. Anche la famiglia send, __send__ e public_send è essenziale.

Osservando l'elenco precedente, dovresti essere in grado di identificare i metodi di "riflessione" che possono essere utilizzati per interrogare e manipolare costanti, metodi, variabili di istanza e così via a livello di programmazione. Poi ci sono i metodi eval e exec. method_missing è uno dei primi che impari, ma presta attenzione anche allo const_missing. Assicurati di controllare set_trace_func e trace_var. E dove saremmo senza alias e alias_method?

Poi ci sono l'interprete "ganci" come method_added, method_removed, method_undefined, inherited, extended, included, singleton_method_added, singleton_method_removed, singleton_method_undefined, instance_method_added, instance_method_removed e instance_method_undefined.

Object#method è essenziale per ottenere gli oggetti Method. Guarda tutti i metodi di Method, incluse cose come owner. Kernel#caller può essere utile a volte. Quindi cerca anche la classe ObjectSpace.

Comprendere che, sebbene abbiano un comportamento particolare, le classi e i moduli sono solo oggetti e li si può creare dinamicamente, archiviarli in strutture di dati, ecc. Non hanno nemmeno bisogno di avere nomi.Puoi semplicemente chiamare Class.new per crearne uno nuovo e usare class_eval, define_method, ecc. Se necessario per aggiungere metodi ad esso.

__LINE__ e __FILE__ possono essere interessanti, in particolare File.read(__FILE__).

La comprensione di blocchi e lambda è importante sia per la programmazione generale di Ruby, sia per la metaprogrammazione in particolare.

2

Nel libro "Metaprogramming Ruby", l'autore afferma che non esiste una linea ferma tra metaprogrammazione e programmazione. È tutto solo programmazione.

Alcuni esempi posso pensare che sono in qualche modo tra la programmazione e metaprogramming sono class e attr_reader.

Problemi correlati