一些 Ruby Dynamic Features 記事 (3) define_method

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

參與討論

1 則留言

發佈留言

發表迴響