Ruby 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_eval
, initialize
和method_missing
?
以下是本页的最佳答案:
方法相关的钩子
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
另外,请查看此博客文章,了解许多这些方法的解释和示例代码。
Object
是一个类,因此您列出的大多数方法实际上是Class
实例方法。 另请Object.private_methods
– 你会在那里找到define_method
,这绝对是必不可少的。 但是binding
也非常强大……在学习Ruby元编程时,你会想看看Binding
类的文档。 send
, __send__
和public_send
系列也很重要。
查看上面的列表,您应该能够识别“reflection”方法,这些方法可用于以编程方式查询和操作常量,方法,实例变量等。 然后是eval
和exec
方法。 method_missing
是你学习的第一个,但也要注意const_missing
。 请务必查看set_trace_func
和trace_var
。 我们在哪里没有alias
和alias_method
?
然后是解释器“hooks”,如method_added
, method_removed
, method_undefined
, inherited
, extended
, included
, singleton_method_added
, singleton_method_removed
, singleton_method_undefined
, instance_method_added
, instance_method_removed
和instance_method_undefined
。
Object#method
对于获取Method
对象至关重要。 查看Method
所有Method
,包括owner
东西。 Kernel#caller
有时很有用。 然后还查找ObjectSpace
类。
理解虽然它们有一些特殊的行为,但是类和模块只是对象,你可以动态创建它们,将它们存储在数据结构中等等。它们甚至不需要有名称。 您可以调用Class.new
来创建一个新的,并根据需要使用class_eval
, define_method
等来向其添加方法。
__LINE__
和__FILE__
可能很有趣,特别是File.read(__FILE__)
。
理解块和lambdas对于一般的Ruby编程和特别是元编程都很重要。
在“Metaprogramming Ruby”一书中,作者指出元编程和编程之间没有确定的界限。 这一切都只是编程。
我能想到的一些例子是编程和元编程之间的class
和attr_reader
。