刚开始学习Ruby元编程。看看Object.methods我得到:
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
,initialize
和method_missing
?
答案 0 :(得分:8)
以下是this页面的最佳答案:
与方法相关的钩子
method_missing
method_added
singleton_method_added
method_removed
singleton_method_removed
method_undefined
singleton_method_undefined
Class&amp;模块挂钩
inherited
append_features
included
extend_object
extended
initialize_copy
const_missing
编组挂钩
marshal_dump
marshal_load
强制挂钩
coerce
induced_from
to_xxx
另外,请查看this博客文章,了解其中许多方法的解释和示例代码。
答案 1 :(得分:5)
Object
是一个类,因此您列出的大多数方法实际上是Class
实例方法。再看Object.private_methods
- 你会在那里找到define_method
,这绝对是必不可少的。但是binding
也非常强大......在学习Ruby元编程时,你会想看看Binding
类的文档。 send
,__send__
和public_send
家庭也很重要。
查看上面的列表,您应该能够识别“反射”方法,这些方法可用于以编程方式查询和操作常量,方法,实例变量等。然后是eval
和exec
方法。 method_missing
是您学习的第一个,但也请注意const_missing
。请务必查看set_trace_func
和trace_var
。如果没有alias
和alias_method
,我们会在哪里?
然后有解释器“钩子”,如method_added
,method_removed
,method_undefined
,inherited
,extended
,included
,{{ 1}},singleton_method_added
,singleton_method_removed
,singleton_method_undefined
,instance_method_added
和instance_method_removed
。
instance_method_undefined
对于获取Object#method
个对象至关重要。查看Method
的所有方法,包括Method
之类的内容。 owner
有时会很有用。然后还要查找Kernel#caller
类。
理解虽然它们有一些特殊的行为,但类和模块只是对象,您可以动态创建它们,将它们存储在数据结构中等等。它们甚至不必具有名称。您只需致电ObjectSpace
制作一个新的,然后根据需要使用Class.new
,class_eval
等方式为其添加方法。
define_method
和__LINE__
可能很有趣,尤其是__FILE__
。
理解块和lambdas对于一般的Ruby编程和特别是元编程都很重要。
答案 2 :(得分:2)
在“Metaprogramming Ruby”一书中,作者指出元编程和编程之间没有明确的界限。这只是编程。
我能想到的一些例子是编程和元编程之间的一些例子class
和attr_reader
。