使用带有哈希的Comparable Mixin

时间:2017-03-13 20:29:17

标签: ruby hash

我已经实现了Comparable模块,希望能够像这样使用哈希:

anthony

我最初的目标是我可以使用anthony2anthony == anthony2来询问哈希值。我认为这是因为==但显然不是这样。只有两个问题:

  1. 哈希如何确定密钥是否为{{1}}自身?
  2. 我应该在这里使用另一个数据结构/ ruby​​类,还是应该实现自己的?

1 个答案:

答案 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