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

Ind*_*cks 0 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
Run Code Online (Sandbox Code Playgroud)

为什么是第二个x.equal? y true?不是xy两个实例Fixnum?为什么它不适用于Fixnum/ Float如上面的例子所示?

Tim*_* H. 5

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

参考: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
Run Code Online (Sandbox Code Playgroud)