Ruby 为哈希键创建对象
我正在尝试为哈希键创建一个对象。这是我的目标Ruby 为哈希键创建对象,ruby,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
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':未初始化常量CompositeKey(namererror)
。
我错过了什么?如何使其工作?将“def”更改为“class”
class CompositeKey
...
end
将“def”更改为“class”
class CompositeKey
...
end
您需要正确定义类并实现
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
class复合键
包括可比
属性读取器:id,:name
def初始化(名称、id)
@id=id
@name=name
结束
def散列
name.hash
结束
def(其他)
结果=self.id其他.id
如果结果==0
self.name其他名称
其他的
结果
结束
结束
结束
通过包含
Comparable
并实现
您将拥有正确的eql?
和=
实现,您的对象现在应该可以安全地用作散列键。您需要正确定义类并实现散列
和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
class复合键
包括可比
属性读取器:id,:name
def初始化(名称、id)
@id=id
@name=name
结束
def散列
name.hash
结束
def(其他)
结果=self.id其他.id
如果结果==0
self.name其他名称
其他的
结果
结束
结束
结束
通过包含
Comparable
并实现
您将拥有正确的eql?
和=
实现,您的对象现在应该可以安全地用作哈希键。如果CompositeKey类存在的唯一原因是哈希键,通过使用数组作为键,您可以更简单地执行此操作:
key = [obj["PAYER NAME"], obj['PAYER ID']]
这是因为数组使用其元素的散列键创建散列键。如果CompositeKey类存在的唯一原因是作为散列键,则可以更简单地使用数组作为键:
key = [obj["PAYER NAME"], obj['PAYER ID']]
这是因为数组使用其元素的散列键创建散列键。使用key.id作为散列键如何?使用key.id作为散列键如何?回答不错。可以是简单的
[self.id,self.name][other.id,other.name]
,或者为了处理轻微的干冲突,创建一个方法,例如state
,返回数组,然后self.state other.state
。不错,我不知道!回答得好。可以是简单的[self.id,self.name][other.id,other.name]
,或者为了处理轻微的干冲突,创建一个方法,例如state
,返回数组,然后self.state other.state
。不错,我不知道!