ruby metaprogramming example

ruby metaprogramming需要熟悉Ruby的一些方法和类:

evalclass_evalmodule_evalconst_getinstance_variable_getinstance_variable_setdefine_methodconst_missingundefremove_methodundef_methodremove_constancestorsconstantsclass_variablesinstance_variablesinstance_methodspublic_instance_methodsprotected_instance_methodsincluded_modulesprivate_methodspublic_methodscallerset_trace_funcObjectSpace.each_objectmethod_missingalias_methodsingleton_method_addedinheritedincludedextend_objectdefine_finalizerblock_given?yield

举例可以为类添加属性property

module Properties def property(sym)   # 实际上,使用Ruby中已有的attr_accessor :property可以起到同样的效果。   define_method(sym) do     instance_variable_get("@#{sym}")   end    define_method("#{sym}=") do |value|      instance_variable_set("@#{sym}", value)      puts sym    end    define_method("add_#{sym}_listener") do |z|      puts sym      z.call('yy') if z.kind_of?Proc      puts z if z.kind_of?String    end endendclass CruiseShip  self.extend Properties  property :direction  property :speed  def initialize    @listener = []  endendh = CruiseShip.newh.add_direction_listener('xxxx')h.add_speed_listener lambda {|x| puts "Oy... someone changed the property to #{x}"}h.speed = 10puts h.speed