所有的对象都有标识
和值
.
标识
标识(ID)
用来标识对象的同一性.Ruby中所有对象都是唯一的, 对象的 ID 可以通过 object_id
(或者__id__
)方法获得.
arr1 = Array.new
arr2 = Array.new
p arr1.object_id
p arr2.__id__
输出结果:
70137139030940
70137139030920
我们用 equal? 方法判断两个对象是否为同一个对象( ID 是否相同 )
str1 = "foo"
str2 = str1
str3 = "f" + "o" + "o"
p str1.equal?(str2)
p str2.equal?(str3)
输出结果:
true
false
Ruby使用 == 来判断对象的值是否相等.
对象的值
就是对象拥有的信息. 例如, 只要对象的字符串内容相等, Ruby就会认为对象的值相等. Ruby使用 == 来判断对象的值是否相等.
str1 = "foo"
str2 = "f" + "o" + "o"
p str1 == str2
输出结果:
ture
除了 == 以外, Ruby 还提供了 eql? 方法来判断对象的值是否相等. == 与 eql? 都是 Object 类定义的方法. 大部分的情况下他们的执行结果都是一样的. 但也有例外, 数值类型重定义 eql? 方法, 因此执行后有不一样的结果.
p 1.0 == 1 #=> true
p 1.0 eql?(1) #=> false
凭直觉来讲, 把 1.0 与 1 判断为相同的值会更加方便. 一般情况下进行值的比较时, 会使用 ==, 但是在一些需要进行更加严谨的比较的程序中, 就需要用到 eql? 方法. 例如, 0 与 0.0 作为散列的键时, 会被判断为不同的键, 这是由于散列对象内部的键的比较使用了 eql? 方法.
hash = { 0 => "212"}
p hash[0.0] #=> nil
p hash[0] #=> "212"