Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为哈希键创建对象_Ruby - Fatal编程技术网

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
。不错,我不知道!