为哈希键创建对象

时间:2013-12-17 20:42:31

标签: ruby

我正在尝试为哈希键创建一个对象。这是我的目标。

def CompositeKey
  def initialize(name, id)
      @id=id
      @name=name
   end
end

然后在同一个文件中我试图使用它。

def add_to_list(list, obj)
  # Find or create the payer
  key = CompositeKey.new(obj["PAYER NAME"], obj['PAYER ID'])
  payer = list[key]
  if payer.nil?
    payer = {}
    list[key] = payer
  end

  # Copy the values into the payer
  copy_to_payer(obj, payer)
end

但我一直收到错误。 rb:57:in 'add_to_list': uninitialized constant CompositeKey (NameError)。 我错过了什么?我如何使这项工作?

3 个答案:

答案 0 :(得分:2)

将'def'更改为'class'

class CompositeKey
...
end

答案 1 :(得分:1)

您需要正确定义类并实现hasheql?方法,否则它将无法用作哈希键:

class CompositeKey

  include Comparable

  attr_reader :id, :name

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

   def hash
     name.hash
   end

   def <=>(other)
     result = self.id <=> other.id
     if result == 0
       self.name <=> other.name
     else
       result 
     end
   end

end

通过加入Comparable并实施<=>,您将拥有正确的eql?==实现,现在您的对象可以安全地用作哈希键。

答案 2 :(得分:1)

如果CompositeKey类存在的唯一原因是哈希键,你可以通过使用数组作为键来更简单地做到这一点:

 key = [obj["PAYER NAME"], obj['PAYER ID']]

这是有效的,因为Arrays从其元素的哈希键中创建它们的哈希键。