Ruby 对象的同一性

所有的对象都有标识.

标识

标识(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"

你可能感兴趣的:(Ruby 对象的同一性)