术-机制:单例类的打开def obj.meth与class <<
2019-10-03 本文已影响0人
稻草人_b788
一、打开单例类的方法
在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节(直接检查和修改单例类)