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 |