Ruby:为什么我不能在fixnum类上定义singlteon方法

时间:2017-10-31 17:05:10

标签: ruby

我想为每个整数值(对象)定义单例方法。但是我在应用单例方法时遇到错误。

RubyDoc说There is effectively only one Fixnum object instance for any given integer value。这是什么意思 ??它与其他普通类有什么不同?我无法解释这一行。

3 个答案:

答案 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中。