2013-12-06 2 views
0

Как переписать ruby ​​Хэш # [] сравнить с?Как переписать ruby ​​Хэш # [] сравнить?

class FooBar 
    def uid 
    "123" 
    end 
    alias_method :to_s, :uid 

    def ==(other) 
    self.uid == other.uid 
    end 
    alias_method :eql?, :== 
end 

class Foo < FooBar 
end 

class Bar < FooBar 
end 

Foo.new == Bar.new # returns true 
Hash[[Foo.new,"succcess"]][Bar.new] # should return "succcess" 
Hash[[Foo.new,"succcess"]].has_key? Bar.new # should return true 
+0

Я почти представил ответ о реализации ['Comparable'] (http://www.ruby-doc.org/core-1.9.3/Comparable.html), но я не уверен, что это то, что вы нужно/хотят. – zwippie

+0

Привет, user2422869, спасибо за попытку улучшить вопрос, но будьте осторожны при редактировании, чтобы вы не случайно исправляли проблему, о которой вас спрашивали! Если вы можете определить проблему, стоящую перед аськой, отправьте ответ вместо этого - таким образом, вопрос + ответ может помочь кому-то другому совершить ту же ошибку в будущем. – Shog9

ответ

3

Вы были близки. Вам также необходимо было переопределить hash. И у вас была дополнительная пара скобок в твоем создании Хэша. Следующие работы:

class FooBar 
    def uid 
    "123" 
    end 
    alias_method :to_s, :uid 

    def ==(other) 
    self.uid == other.uid 
    end 
    alias_method :eql?, :== 

    def hash 
    uid.hash 
    end 

end 

class Foo < FooBar 
end 

class Bar < FooBar 
end 

Foo.new == Bar.new # returns true 
Hash[Foo.new,"succcess"][Bar.new] # returns "succcess" 
Hash[Foo.new,"succcess"].has_key? Bar.new # returns true 

См Which equality test does Ruby's Hash use when comparing keys? для дополнительного обсуждения.

Смежные вопросы