我已经实现了Comparable
模块,希望能够像这样使用哈希:
anthony
我最初的目标是我可以使用anthony2
或anthony == anthony2
来询问哈希值。我认为这是因为==
但显然不是这样。只有两个问题:
答案 0 :(得分:4)
Comparable
模块用于订购。如果你想为了哈希的目的而处理等价,你还有一些工作要做。
来自Hash的文档:
当两个对象的
hash
值相同且两个对象彼此为eql?
时,它们引用相同的哈希键。
所以你需要再扩展一下。由于您的@name.downcase
非常重要,我添加了一个变量来捕获它以减少需要多少计算。反复降低同样的东西是浪费,特别是当用于比较时:
class Author
include Comparable
attr_reader :name
attr_reader :key
def initialize(name)
@name = name
@key = @name.downcase
end
def hash
@key.hash
end
def eql?(other)
@key.eql?(other.key)
end
def <=>(other)
@key <=> other.key
end
end
现在这样做了:
Author.new('Bob') == Author.new('bob')
# => true
以及:
h = { }
h[Author.new('Bob')] = true
h[Author.new('bob')]
# => true