ruby metaprogramming example

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

eval
class_eval
module_eval
const_get
instance_variable_get
instance_variable_set
define_method
const_missing
undef
remove_method
undef_method
remove_const
ancestors
constants
class_variables
instance_variables
instance_methods
public_instance_methods
protected_instance_methods
included_modules
private_methods
public_methods
caller
set_trace_func
ObjectSpace.each_object
method_missing
alias_method
singleton_method_added
inherited
included
extend_object
define_finalizer
block_given?
yield

举例可以为类添加属性property

module
def property(sym)
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
end
end
class CruiseShip
self.extend Properties
property :direction
property :speed
def initialize
@listener = []
end
end
h = CruiseShip.new
h.add_direction_listener('xxxx')
h.add_speed_listener lambda {|x| puts "Oy... someone changed the property to #{x}"}
h.speed = 10
puts h.speed