singleton_class.send&的目的是什么?这个元编程示例中的singleton_class.class_eval?

时间:2009-07-26 16:11:32

标签: ruby metaprogramming

class Product < ActiveRecord::Base
 set_table_name 'produce'
end

module ActiveRecord
  class Base
    def self.set_table_name name
    define_attr_method :table_name, name
  end

  def self.define_attr_method(name, value)
    singleton_class.send :alias_method, "original_#{name}", name
    singleton_class.class_eval do
      define_method(name) do
        value
      end
    end
  end
end

我想了解在此示例中如何定义set_table_name

为什么需要singleton_class.send

为什么在class_eval而不是在singleton_class上调用self

1 个答案:

答案 0 :(得分:4)

使用“singleton_class”的原因是因为您不想修改ActiveRecord :: Base类,而是修改Product类。

有关metaptogramming和singleton class的更多信息,请访问:http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html