我正在尝试为哈希键创建一个对象。这是我的目标。
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)
。
我错过了什么?我如何使这项工作?
答案 0 :(得分:2)
将'def'更改为'class'
class CompositeKey
...
end
答案 1 :(得分:1)
您需要正确定义类并实现hash
和eql?
方法,否则它将无法用作哈希键:
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从其元素的哈希键中创建它们的哈希键。