比较两个对象,从严格要求来说,"==" < "eql?" < "equal?",而“===”表示某种匹配模式

1."=="表示值形同
2."eql?"要求值和对象类型都必须相同。
3."equal?"是指两个对象的object_id值一样,即是引用同一个对象。
4.“===”表示某种匹配模式表示某种匹配
1. "=="表示值形同
#字符串的内容相同
a = "string"
b = "string" + ""
a == b  #=>true
#数值相同
a = 1
b = 1.0
a == b #=>true
2. "eql?"要求值和对象类型都必须相同
a = "string"
b = "string"+""
a.eql?b #=>true
#上面的a和b两个值相同,并且属于String类

a = 1
b = 1.0
a.eql?b #=>false
#上面的a和b两个值相同,但是1属于Integer类,b属于Float类
3. "equal?"是指两个对象的object_id值一样,即是引用同一个对象。
obj = "a"
other = obj.dup
obj == other #=> true
obj.equal? other #=> false
obj.equal? obj #=> true

a = "string"
b = "string" + ""
a.object_id #=>70268974328100
b.object_id #=>70268970910720
a == b #=>true #a和b的数值相同
a.equal?b #=>false #a和b有不同的object_id

a = 1
b = 1.0
a == b #=>true #=>a和b的数值相同
a.object_id #=>3
b.object_id #=>-36028797018963966
a.equal?b #=>false #a和b具有不同的object_id
4.“===”表示某种匹配模式表示某种匹配
def demo(command)
  case command
  when "string" then"string"
  when Numeric then "number"
  else "not match"
  end
end

1.一般情况下,case中的“===”实现的的是“==”方法
"string" == "string" #true

2.如果when之后是类或者模块,command是其类或者模块的对象则满足
Array === [1,2,3] #true
其实调用的是 [1,2,3].is_a?(Array)

3.如果是Regexp对象,则执行Regexp对象的"==="方法
/^[A-Z]*$/ === "HELLO" #=> true

下面的知识点未理解:关于为何计算hash的key的时候需要这样计算

在hash中key必须是唯一的,如果是不同的对象在调用hash方法时也可以返回相同的值,必须重写hash方法和eql?方法

class Color
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def hash
    name.hash
  end

  def eql?(other)
    name.eql?(other.name)
  end
end

a = Color.new("jayzen")
b = Color.new("jayzen")

c = {a=>"like", b=>"love"}
p c #{#<Color:0x00007fb23d12da80 @name="jayzen">=>"love"} 可以看出只有一个键,后面的键会覆盖前面的键

results matching ""

    No results matching ""