Ruby 动态添加类方法 (eigenclass --- 2)

zputee · 2013年04月24日 · 3346 次阅读

类是类的 singleton_class 类(eigenclass 类)的实例对象 先有蛋还是先有鸡? 类、类、类....,有点累吧,^_^

一、向类添加的实例方法,(添加类的 singleton_method)

class MyClass
end
a = MyClass.new
#方法1(动态)
MyClass.class_eval %{  
  def hi
    p "hi,world"
  end
}
#方法2(动态)
MyClass.send(:define_method, :hi2){p 'hi, world'}

#调用
a.hi
a.hi2
#=>"hi,world"
#检查
a.methods.grep /^hi+/
MyClass.instance_methods (false)

二、添加类方法,(添加类的 singleton_method)

class MyClass
end

#方法1,使用class_eval(动态)
MyClass.class_eval %{  
  def self.hi
    p "hi,world"
  end
}
#方法2,使用send(动态)
MyClass.singleton_class.send(:define_method, :hi2){p 'hi, world'}

#方法3, 打开MyClass.singleton_class (eigenclass)
class <<MyClass
  def hi3
    p "hi,world"
  end
end
MyClass.hi
MyClass.hi2
MyClass.hi3

MyClass.methods(false)
MyClass.singleton_methods(false)
MyClass.singleton_class.instance_methods(false)

三、向 engenclass 类方法,(可以继承,很少用!)

class <<MyClass #很少用
  def self.hello
    p "i'm in 'MyClass.singleton_classs.methods'"
  end
end
MyClass.singleton_class.hello
MyClass.singleton_class.methods(false)
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号