Ruby:为什么我不能在fixnum类上定义SingleTon方法
我想为每个整数值(对象)定义单例方法。但我在应用singleton方法时遇到了错误Ruby:为什么我不能在fixnum类上定义SingleTon方法,ruby,Ruby,我想为每个整数值(对象)定义单例方法。但我在应用singleton方法时遇到了错误 RubyDoc说,对于任何给定的整数值,实际上只有一个Fixnum对象实例。这是什么意思??它与其他普通课程有什么不同??我无法解释这句话 这意味着每当您访问某个Fixnum时,例如数字1,您总是使用相同的“实例”,这主要是ruby用来优化数字的实现细节。默认情况下,Integer类被冻结: 1.frozen? => true 任何整数对象只存在一个实例。您无需执行任何特殊操作即可启用此功能。换句话说,
RubyDoc说,对于任何给定的整数值,实际上只有一个Fixnum对象实例。这是什么意思??它与其他普通课程有什么不同??我无法解释这句话 这意味着每当您访问某个Fixnum时,例如数字1,您总是使用相同的“实例”,这主要是ruby用来优化数字的实现细节。默认情况下,
Integer
类被冻结:
1.frozen?
=> true
任何整数对象只存在一个实例。您无需执行任何特殊操作即可启用此功能。换句话说,您尝试应用的优化是内置在Ruby中的
我想为每个整数值(对象)定义单例方法
这是矛盾的。singleton类适用于希望将某些内容应用于单个对象的情况。您希望为每个整数对象定义一些东西,因此singleton类不是合适的工具。使用普通类即可
class Integer
def foobar
"hey"
end
end
3.foobar
# "hey"
如果可以修改3的singleton类,那么会有一些行为只适用于数字3,而不适用于其他数字。没有技术上的理由来阻止这一点,但相信我,这是一件好事,你不能
对于任何给定的整数值,实际上只有一个Fixnum对象实例
这是在谈论别的事情。请注意区别:
x = []
y = []
x == y # true
x.object_id == y.object_id # false!
x = 3
y = 3
x == y # true
x.object_id == y.object_id # true!
x.object_id == 5.object_id # false
与大多数其他对象不同,相等的FixNum是相同的对象。3和5是Fixnum的两个不同实例,但不可能有两个都是3的不同Fixnum实例。每3个都是一样的。同样,这不是技术上的必要性,但更方便大多数程序员如何看待数字数据。编码,人们想看看代码你得到了什么错误?有一个技术原因可以防止这种情况,
Fixnum
s(在MRI中)表示为纯C整数,而不是像其他对象一样的结构,所以他们不能开单身班。当然,这只是一个实现细节,它使小整数工作得更快,但最终决定对所有整数保持这种方式(Fixnum
s和Bignum
s,它们现在统一在Integer
类下)。没错,但我的观点是不需要这样。该语言可以以不同的方式定义/实现,而不存在任何内部不一致性。正如您所指出的,我认为这个决定是为了与其他OO语言更加一致,为了提高效率。