2012-02-28 24 views
6

Chỉ cần bắt đầu học lập trình meta metapro của Ruby. Nhìn vào Object.methods tôi nhận được:Danh sách các phương pháp lập trình Ruby Metaprogramming?

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

Có danh sách các phương pháp hữu ích cho lập trình meta không? Chẳng hạn như instance_eval, initializemethod_missing?

+3

Nếu metaprogramming Ruby là một mối quan tâm nghiêm trọng, tôi khuyên bạn nên [cuốn sách Metaprogramming Ruby] (http://pragprog.com/book/ppmetr/metaprogramming-ruby) của Paolo Perrotta. – sarnold

Trả lời

8

Dưới đây là câu trả lời đầu từ this page:

Phương pháp liên quan đến móc

method_missing 
method_added 
singleton_method_added 
method_removed 
singleton_method_removed 
method_undefined 
singleton_method_undefined 

Lớp & Mô-đun Móc

inherited 
append_features 
included 
extend_object 
extended 
initialize_copy 
const_missing 

Marshalling Móc

marshal_dump 
marshal_load 

Cưỡng chế Móc

coerce 
induced_from 
to_xxx 

Ngoài ra, kiểm tra this bài đăng blog để giải thích và mẫu mã cho rất nhiều các phương pháp.

+0

Lưu ý rằng đây là những móc tuyệt vời, nhưng không bao gồm những thứ như 'instance_eval' hoặc' define_method'. – Phrogz

5

Object là một lớp, vì vậy, hầu hết các phương pháp bạn liệt kê thực tế là phương pháp thể hiện Class. Xem thêm tại Object.private_methods - bạn sẽ tìm thấy define_method trong đó, điều này hoàn toàn cần thiết. Nhưng binding cũng rất mạnh ... khi tìm hiểu về lập trình meta metapro, bạn sẽ muốn xem các tài liệu cho lớp Binding. send, __send__ và gia đình public_send cũng rất cần thiết.

Nhìn vào danh sách ở trên, bạn sẽ có thể xác định các phương pháp "phản chiếu" có thể được sử dụng để truy vấn và thao tác hằng số, phương pháp, biến mẫu, v.v. Sau đó, có các phương pháp evalexec. method_missing là một trong những người đầu tiên bạn học, nhưng cũng chú ý đến const_missing. Hãy nhớ xem set_trace_functrace_var. Và chúng ta sẽ ở đâu nếu không có aliasalias_method?

Sau đó, có người phiên dịch "móc" như method_added, method_removed, method_undefined, inherited, extended, included, singleton_method_added, singleton_method_removed, singleton_method_undefined, instance_method_added, instance_method_removed, và instance_method_undefined.

Object#method là điều cần thiết để nhận các đối tượng Method. Xem tất cả các phương pháp của Method, bao gồm những thứ như owner. Kernel#caller có thể hữu ích đôi khi. Sau đó, hãy tìm lớp ObjectSpace.

Hiểu rằng mặc dù chúng có một số hành vi đặc biệt, các lớp và mô-đun chỉ là các đối tượng và bạn có thể tạo chúng động, lưu trữ chúng trong cấu trúc dữ liệu, vv.Bạn chỉ có thể gọi Class.new để tạo một số mới và sử dụng class_eval, define_method, v.v. nếu cần để thêm phương thức vào đó.

__LINE____FILE__ có thể thú vị, đặc biệt là File.read(__FILE__).

Hiểu rõ các khối và lambdas rất quan trọng đối với cả lập trình Ruby nói chung, và cho lập trình meta đặc biệt.

2

Trong cuốn sách "Metaprogramming Ruby", tác giả nói rằng không có ranh giới vững chắc giữa lập trình meta và lập trình. Tất cả chỉ là lập trình.

Một số ví dụ tôi có thể nghĩ rằng có phần nào nằm giữa chương trình và lập trình meta là classattr_reader.

Các vấn đề liên quan