Ruby Metaprogramming方法列表?

时间:2012-02-28 22:31:49

标签: ruby object reflection methods metaprogramming

刚开始学习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_evalinitializemethod_missing

3 个答案:

答案 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家庭也很重要。

查看上面的列表,您应该能够识别“反射”方法,这些方法可用于以编程方式查询和操作常量,方法,实例变量等。然后是evalexec方法。 method_missing是您学习的第一个,但也请注意const_missing。请务必查看set_trace_functrace_var。如果没有aliasalias_method,我们会在哪里?

然后有解释器“钩子”,如method_addedmethod_removedmethod_undefinedinheritedextendedincluded,{{ 1}},singleton_method_addedsingleton_method_removedsingleton_method_undefinedinstance_method_addedinstance_method_removed

instance_method_undefined对于获取Object#method个对象至关重要。查看Method的所有方法,包括Method之类的内容。 owner有时会很有用。然后还要查找Kernel#caller类。

理解虽然它们有一些特殊的行为,但类和模块只是对象,您可以动态创建它们,将它们存储在数据结构中等等。它们甚至不必具有名称。您只需致电ObjectSpace制作一个新的,然后根据需要使用Class.newclass_eval等方式为其添加方法。

define_method__LINE__可能很有趣,尤其是__FILE__

理解块和lambdas对于一般的Ruby编程和特别是元编程都很重要。

答案 2 :(得分:2)

在“Metaprogramming Ruby”一书中,作者指出元编程和编程之间没有明确的界限。这只是编程。

我能想到的一些例子是编程和元编程之间的一些例子classattr_reader

相关问题