Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:为什么我不能在fixnum类上定义SingleTon方法_Ruby - Fatal编程技术网

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

Ruby:为什么我不能在fixnum类上定义SingleTon方法,ruby,Ruby,我想为每个整数值(对象)定义单例方法。但我在应用singleton方法时遇到了错误 RubyDoc说,对于任何给定的整数值,实际上只有一个Fixnum对象实例。这是什么意思??它与其他普通课程有什么不同??我无法解释这句话 这意味着每当您访问某个Fixnum时,例如数字1,您总是使用相同的“实例”,这主要是ruby用来优化数字的实现细节。默认情况下,Integer类被冻结: 1.frozen? => true 任何整数对象只存在一个实例。您无需执行任何特殊操作即可启用此功能。换句话说,

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


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个都是一样的。同样,这不是技术上的必要性,但更方便大多数程序员如何看待数字数据。

编码,人们想看看代码你得到了什么错误?有一个技术原因可以防止这种情况,Fixnums(在MRI中)表示为纯C整数,而不是像其他对象一样的结构,所以他们不能开单身班。当然,这只是一个实现细节,它使小整数工作得更快,但最终决定对所有整数保持这种方式(
Fixnum
s和
Bignum
s,它们现在统一在
Integer
类下)。没错,但我的观点是不需要这样。该语言可以以不同的方式定义/实现,而不存在任何内部不一致性。正如您所指出的,我认为这个决定是为了与其他OO语言更加一致,为了提高效率。