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
發佈留言