Я не понимаю разницы между проверкой равенства структур и классов.Поскольку и Struct, и Class получают свои #hash от ядра, но, похоже, они ведут себя по-разному.
Я знаю, что instance.hash выдаст разные результаты для каждого экземпляра класса.Экземпляр Struct имеет разных предков [Customer, Struct, Enumerable, Object, Kernel, BasicObject] по сравнению с экземпляром класса [Foo, Object, Kernel, BasicObject].Что в действительности заставило каждый экземпляр Class иметь свой хеш-номер, чтобы
Customer = Struct.new(:name, :phone, :address) do
end
class Foo
def initialize(the_name, phone, address)
@name = the_name
@phone = phone
@address = address
end
end
str_a = Customer.new('bond', 'ring', 'address')
str_b = Customer.new('bond', 'ring', 'address')
foo_a = Foo.new('bond', 'ring', 'address')
foo_b = Foo.new('bond', 'ring', 'address')
p str_a == str_b #true
p foo_a == foo_b #false
p str_a.hash # 4473040617195177332
p str_b.hash # 4473040617195177332
p foo_a.hash # -3118151143418428190
p foo_b.hash # -1042397847400824657
p str_a.method(:hash).owner #Kernel
p foo_a.method(:hash).owner #Kernel
, и Struct, и Class используют Kernel для генерации hash_number.Почему другой экземпляр Class создает другой хэш int, а экземпляр Struct создает тот же самый int хэш?