2015-04-04 33 views
0

按照定义,equal?检查两个对象是否相同,其中eql?检查类是否相同且值相同。等于?和eql? Fixnum上的运营商

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? ytrue?是不是xy两个实例Fixnum?为什么它不适用于Fixnum/Float,如上例所示?

回答

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 
0

我知道这个问题已经回答,但我会添加此有关的object_id的

my_string << 'something'my_string.replace 'something'和爆炸的方法,如my_string.strip!不改变,这就是为什么你可以改变一个常量的内容OBJECT_ID像MyString = 'test'

MyString.freeze将阻止你不断beeing可变的。

这是很好的尝试这样的东西来学习语言:

irb(main):024:0> x = '1' 
=> "1" 
irb(main):025:0> y = x 
=> "1" 
irb(main):026:0> x.equal? y 
=> true 
irb(main):027:0> x << 'test' 
=> "1test" 
irb(main):028:0> y 
=> "1test" 
irb(main):029:0> nope = nope 
=> nil