术-机制:单例类的打开def obj.meth与class << obj; def meth的区别

一、打开单例类的方法

在ruby中打开单例类有两种方法:
一种是def obj.meth的形式,另一种是class << obj; def meth的形式。

二、两种打开单例类的方法的区别

通常情况下,两种并没有什么区别。
唯一一个不同点在于:常量解析的方式
如果有一个顶层的常量N,同时也定义一个N在对象的单例类中:

N = 1 #顶层的常量N
obj = Object.new
class << obj #打开obj对象的单例类
    N = 2 #obj对象的单例类中的常量N
    def show_N
      puts N
    end
end

def obj.show_N_another_way
    puts N
end

运行代码后,结果为:

obj.show_N #结果为2

obj.show_N_another_way  #结果为1

这个区别在常量可见性对代码的影响上比较少见,在大多数的情况下,这两种单例方法定义的方式是可相互替换的。但是了解它们的不同是值得的,可用于解释一些出乎意料的结果。

三、建议

1.如果没有那么多方法要添加到单例类中,可以使用简短的def obj.meth形式来打开单例类并构建单例方法。
2.如果有很多方法要加入到单例类,或者需要在单例类中加入模块,那么class << obj; def meth的形式更为灵活和美观。

四、参考资料

1.《Ruby程序员修炼之道(第2版)》[美] David A. Black--第13章1节(直接检查和修改单例类)

你可能感兴趣的:(术-机制:单例类的打开def obj.meth与class << obj; def meth的区别)