2012-02-28 16 views
6

Właśnie rozpocząłem naukę metaprogramowania Ruby. Patrząc na Object.methods uzyskać:Lista metod metaprogramowania Rubiego?

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

Czy istnieje lista metod, które są przydatne dla metaprogramowanie? Takich jak , initialize i ?

+3

Jeśli metaprogramowanie Ruby jest poważnym interesem, gorąco polecam [Metaprograming Ruby book] (http://pragprog.com/book/ppmetr/metaprogramming-ruby) autorstwa Paolo Perrotta. – sarnold

Odpowiedz

8

Oto top odpowiedź od this stronie:

związane Method-haki

method_missing 
method_added 
singleton_method_added 
method_removed 
singleton_method_removed 
method_undefined 
singleton_method_undefined 

Class & Moduł Haki

inherited 
append_features 
included 
extend_object 
extended 
initialize_copy 
const_missing 

Marshalling Haki

marshal_dump 
marshal_load 

Przymus Haki

coerce 
induced_from 
to_xxx 

także sprawdzić this blogu o wyjaśnienia i przykładowy kod dla wielu z tych metod.

+0

Zauważ, że są to świetne hooki, ale nie zawierają rzeczy typu 'instance_eval' lub' define_method'. – Phrogz

5

Object to klasa, więc większość wymienionych metod to w rzeczywistości metody instancji Class. Spójrz też na Object.private_methods - tam znajdziesz define_method, co jest absolutnie niezbędne. Ale binding jest również bardzo potężny ... podczas nauki o metaprogramowaniu Ruby będziesz chciał przejrzeć dokumenty dla klasy Binding. Niezbędna jest także rodzina send, __send__ i public_send.

Patrząc na powyższą listę, powinieneś być w stanie zidentyfikować metody "odbicia", które mogą być używane do kwerendy i manipulowania stałymi, metodami, zmiennymi instancji itd. Programowo. Następnie są metody eval i exec. method_missing jest jednym z pierwszych, których się uczysz, ale zwróć też uwagę na const_missing. Pamiętaj, aby sprawdzić: set_trace_func i trace_var. A gdzie byśmy byli bez alias i alias_method?

Następnie istnieją tłumacza "haczyki" jak method_added, method_removed, method_undefined, inherited, extended, included, singleton_method_added, singleton_method_removed, singleton_method_undefined, instance_method_added, instance_method_removed i instance_method_undefined.

Object#method jest niezbędny do uzyskania obiektów Method. Spójrz na wszystkie metody z Method, w tym takie rzeczy jak owner. Kernel#caller może się czasem przydać. Następnie sprawdź klasę ObjectSpace.

Rozumiem, że chociaż mają pewne szczególne zachowanie, klasy i moduły są po prostu obiektami i można je tworzyć dynamicznie, przechowywać je w strukturach danych itp. Nie muszą nawet mieć nazw.Możesz po prostu zadzwonić pod numer Class.new, aby utworzyć nowy i użyć class_eval, define_method itp., Aby dodać do niego metody.

__LINE__ i __FILE__ może być interesujące, zwłaszcza File.read(__FILE__).

Zrozumienie bloków i znaków lambda jest ważne zarówno dla ogólnego programowania w języku Ruby, jak i dla metaprogramowania w szczególności.

2

W książce "Metaprograming Ruby" autor stwierdza, że ​​nie ma sztywnej linii między metaprogramowaniem a programowaniem. To wszystko tylko programowanie.

Niektóre przykłady, o których mogę pomyśleć, są nieco między programowaniem a metaprogramingiem: class i attr_reader.

Powiązane problemy