根据定义,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
true
? x
和y
两个Fixnum
个实例不是吗?为什么它不适用于Fixnum
/ Float
,如上例所示?
答案 0 :(得分: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
答案 1 :(得分:0)
我知道这个问题已经得到解答但是我会在object_id&#39>中添加这个问题
my_string << 'something'
和my_string.replace 'something'
以及my_string.strip!
之类的爆炸方法不会改变object_id,这就是为什么你可以更改{{{{{{{{{{{{ 1}}
但是MyString = 'test'
会阻止你不断变化。
尝试这样的事情来学习语言是很好的:
MyString.freeze