Tbpgr Blog

元エンジニア 人事 tbpgr(てぃーびー) のブログ

Ruby | Object | hash

概要

Object#hash -> Fixnum

詳細

オブジェクトのハッシュ値を返却。
Hashクラスで利用。

サンプルコード
require 'set'

a = "hoge"
b = "hoge"

# String は eql? が同値チェックになっている
p a == b # => true
p a.eql? b # => true
p a.equal? b # => false

a = :hoge
b = :hoge

# Symbol は eql? が同値チェックになっていて、
# singleton のため object_id も同じになっている
p a == b # => true
p a.eql? b # => true
p a.equal? b # => true

class Person
  attr_reader :name, :age

  def initialize(name, age)
    @name, @age = name, age
  end

  def ==(other)
    @name == other.name && @age == other.age
  end
end

a = Person.new('tanaka', 25)
b = Person.new('tanaka', 25)

# 自作クラスはデフォルトだと eql? と equal? が同じ挙動
p a == b # => true
p a.eql? b # => false
p a.equal? b # => false
p a.hash # => -776684713
p b.hash # => 255701755
print Set[a, b].size, "\n" # => 2
print [a, b].uniq.size, "\n" # => 2
people_hash = {}
people_hash[a] = 1
people_hash[b] = 2
print people_hash.size, "\n" # => 2

class Person
  def eql?(other)
    @name == other.name && @age == other.age
  end

  def hash
    [@name, @age].hash
  end
end

# 自作クラスの eql?, hash をオーバーライドすると同値チェックを実現できる
p a == b # => true
p a.eql? b # => true
p a.equal? b # => false
p a.hash # => -535996792
p b.hash # => -535996792
print Set[a, b].size, "\n" # => 1
print [a, b].uniq.size, "\n" # => 1
people_hash = {}
people_hash[a] = 1
people_hash[b] = 2
print people_hash.size, "\n" # => 1

出力

true
true
false
true
true
true
true
false
false
-425608101
702434399
2
2
2
true
true
false
770159162
770159162
1
1
1