2012-02-28 56 views
6

剛剛開始學習Ruby元編程。看Object.methods我得到: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__] 

是否有一個方法的列表是有用的元編程?如instance_eval,initializemethod_missing

+3

如果元編程Ruby是一個嚴肅的興趣,我強烈推薦Paolo Perrotta編寫的[Metoprogramming Ruby book](http://pragprog.com/book/ppmetr/metaprogramming-ruby)。 – sarnold 2012-02-28 22:34:13

回答

8

這裏是this頁面頂端回答:

方法相關的掛鉤

method_missing 
method_added 
singleton_method_added 
method_removed 
singleton_method_removed 
method_undefined 
singleton_method_undefined 

類&模塊魚鉤

inherited 
append_features 
included 
extend_object 
extended 
initialize_copy 
const_missing 

編組站鉤

marshal_dump 
marshal_load 

強制魚鉤

coerce 
induced_from 
to_xxx 

此外,檢查this博客帖子的解釋和示例代碼的許多這些方法。

+0

請注意,這些都是很棒的鉤子,但不包括'instance_eval'或'define_method'之類的東西。 – Phrogz 2012-02-28 23:32:28

5

Object是一個類,所以你列出的大多數方法實際上是Class實例方法。還請看Object.private_methods - 你會在那裏找到define_method,這是絕對必要的。但binding也非常強大......在瞭解Ruby元編程時,您需要查看Binding類的文檔。 send,__send__public_send家族也是必不可少的。

查看上面的列表,您應該能夠識別可用於以編程方式查詢和操作常量,方法,實例變量等的「反射」方法。然後有evalexec方法。 method_missing是您學習的第一批之一,但請注意const_missing也。請務必查看set_trace_functrace_var。並且我們將在哪裏沒有aliasalias_method

再就是解釋 「掛鉤」 等method_addedmethod_removedmethod_undefinedinheritedextendedincludedsingleton_method_addedsingleton_method_removedsingleton_method_undefinedinstance_method_addedinstance_method_removed,和instance_method_undefined

Object#method對於獲取Method對象是必不可少的。看看Method的所有方法,包括像owner這樣的東西。有時可以使用Kernel#caller。然後再查看ObjectSpace課程。

要明白,雖然它們有一些特殊的行爲,但類和模塊只是對象,您可以動態創建它們,將它們存儲在數據結構等中,它們甚至不必具有名稱。您可以撥打Class.new來創建一個新的,並根據需要使用class_evaldefine_method等來向其添加方法。

__LINE____FILE__可能很有趣,尤其是File.read(__FILE__)

理解塊和lambdas對於一般的Ruby編程和特別是元編程都很重要。

2

在「Metaprogramming Ruby」一書中,作者指出在元編程和編程之間沒有牢固的界限。這都只是編程。

我能想到的一些例子在編程和元編程之間有些差別,分別是classattr_reader