打开单件类
Ruby提供了两种方法获取单件类的引用,一种是通过传统的关键词class配合特殊的语法
法一
class << an_object # 自己的代码 end obj = Object.new singleton_class = class << obj self end singleton_class.class # => Class
另一个方法是,通过Object#singleton_class方法来获得单件类的引用:
法二
“abc”.singleton_class # => #<Class: #<String:0xxxxxx>>
单件类的特性
基于上面对单件类的基本认识,引入单件类后,Ruby的方法查找方式就不应该是先从其类(普通类)开始,而是应该先从对象的单件类中开始查找,如果在单件类中没有找到想要的方法,它才会开始沿着类(普通类)开始,再到祖先链上去找。这样从单件类之后开始,一切又回到了我们在没有引入单件类时候的次序。
通过下面这个代码可以自行验证一下
class C
def a_method
‘C#a_method()'
end
end
class D < C; end
obj = D.new
打开单件类定义单件方法
class << obj
def a_singleton_method
‘obj#a_singleton_method()'
end
end
obj.singleton_class.superclass #=> D










