Update(2010/4/15): self, current class 與 class_eval, instance_eval 的關係
define_method 讓函式名稱也可以參數化。
動態定義物件方法 drag.foo
#法一
Dragon.send(:define_method, :foo){ puts "bar" }
#法二
class Dragon
define_method(:foo) { puts "bar" }
['a','b','c','d','e','f'].each do |x|
define_method(x) { puts x }
end
end
#法三
Dragon.class_eval do
define_method(:foo) { puts "bar" }
def foo2
puts "bar2"
end
end
#法四
class Dragon
def new_method(name, &block)
self.class.send(:define_method,name, &block)
#或
self.class.class_eval do
define_method(name, &block)
end
end
end
drag.new_method(:foo) { puts "bar" }
動態定義類別方法 Dragon.foo
# 法一
class Dragon
class << self
define_method(:foo) { puts "bar" }
end
end
# 法二
class Dragon; end
metaclass = (class << Dragon; self; end)
metaclass.instance_eval do # 用 class_eval 也可以
define_method("foo") { puts "bar" }
end
發佈留言