2013-12-17 114 views
1

我試圖創建一個哈希鍵的對象。這是我的目標。創建對象的哈希鍵

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

如何使用key.id作爲散列鍵? – Donovan

回答

2

更改「高清」到「類」

class CompositeKey 
... 
end 
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?==實現你的目標,現在應該是安全哈希鍵使用。

+1

很好的答案。 <=>可以簡單'[self.id,self.name] <=> [other.id,other.name]',或應對輕微DRY違反,創建諸如'state'的方法,該方法返回數組,然後' self.state <=> other.state'。 –

+0

不錯,不知道! –

1

如果用於CompositeKey類存在的唯一理由是要哈希鍵,就可以更簡單地使用數組作爲重點做到:

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

這工作,因爲陣列創建自己的哈希鍵入他們元素的散列鍵。