等于?和eql? Fixnum上的运算符

时间:2015-04-04 16:43:35

标签: ruby

根据定义,equal?检查两个对象是否相同,eql?检查类是否相同且值是否相同。

x = 'hi'
y = 'hi'
x.equal? y # => false
x.eql? y # => true

x = 1
y = 1
x.equal? y # => true
x.eql? y # => true

为什么第二个x.equal? y truexy两个Fixnum个实例不是吗?为什么它不适用于Fixnum / Float,如上例所示?

2 个答案:

答案 0 :(得分:5)

因为xy实际上指的是完全相同的对象。与字符串不同,每个整数值在任何给定时间只有一个实例。

参考:http://ruby-doc.org/core-2.2.1/Fixnum.html

  

对于任何给定的整数值[...]

,实际上只有一个Fixnum对象实例

编辑: 为了使它更清晰,您可能希望查看这些对象的object_id:

irb(main):001:0> x = 1
=> 1
irb(main):002:0> y = 1
=> 1
irb(main):003:0> x.object_id
=> 3
irb(main):004:0> y.object_id
=> 3 # Same ID as above
irb(main):005:0> x = 'hi'
=> "hi"
irb(main):006:0> y = 'hi'
=> "hi"
irb(main):007:0> x.object_id
=> 70287051883000
irb(main):008:0> y.object_id
=> 70287051869720 # Different ID than X

答案 1 :(得分:0)

我知道这个问题已经得到解答但是我会在object_id&#39>中添加这个问题

my_string << 'something'my_string.replace 'something'以及my_string.strip!之类的爆炸方法不会改变object_id,这就是为什么你可以更改{{{{{{{{{{{{ 1}}

但是MyString = 'test'会阻止你不断变化。

尝试这样的事情来学习语言是很好的:

MyString.freeze