我想为每个整数值(对象)定义单例方法。但是我在应用单例方法时遇到错误。
RubyDoc说There is effectively only one Fixnum object instance for any given integer value
。这是什么意思 ??它与其他普通类有什么不同?我无法解释这一行。
答案 0 :(得分:3)
我想为每个整数值(对象)定义单例方法
这是矛盾的。单例类用于何时需要将某些内容应用于单个对象。您想为每个整数对象定义一些内容,因此单例类不是合适的工具。只需使用普通类
class Integer
def foobar
"hey"
end
end
3.foobar
# "hey"
如果你可以修改3的单例类,那么会有一些行为只适用于数字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
与大多数其他对象不同,相同的fixnums是相同的对象。 3和5是Fixnum的两个不同实例,但不可能有两个不同的Fixnum实例,它们都是3.每个3都是相同的。同样,这不是技术上的必需品,而是更方便大多数程序员如何看待数值数据。
答案 1 :(得分:2)
这意味着无论何时访问某些Fixnum(例如数字1),您总是使用相同的“实例”进行处理,这主要是ruby用于优化数字的实现细节。
答案 2 :(得分:2)
默认冻结Integer
类:
1.frozen?
=> true
只存在任何Integer对象的一个实例。你不必做任何特别的事情来实现这一点。换句话说,您尝试应用的优化内置于Ruby中。