2013-05-25 24 views
-1

我有一個散列值爲數組的散列。 問題是我有組中的兩個鍵的值必須相同。在Ruby中創建引用的散列表

所以我需要確保散列是引用的散列值而不是值,但我不確定ruby的複製語義。

+0

舉例說明。 「按鍵類別」是什麼意思?你是什​​麼意思'複製紅寶石的語義。「? –

+1

請提供一些示例輸入和輸出示例。 –

回答

3

這有幫助嗎?

a = %w(a b c) # create an array 
p a # have a look at it 
p a.object_id # this is how ruby references the array 
# =>68669980 
hash = {'a_key'=>a} #put it in a hash 
p hash['a_key']# have a look at it again 
p hash['a_key'].object_id # no copy, just a reference 
# =>68669980 
+0

這裏要注意的重要一點是,一切都是Ruby中的參考。即使':foo'或'2'也只是對單例對象的引用。 – tadman

1

這應該回答你關於「引用的哈希值」的問題,對於數組:

array = [1,2] 
    hash = { :k1 => array, :k2 => array } 
    hash[:k1].push(3) 
    puts hash[:k2].inspect 
    => [ 1, 2, 3 ] 

正如你所看到的,數組變量是在Ruby中的底層對象的引用。 Ruby中的大多數對象都是如此,除了一些「直接」類型,例如FixnumFloat

因此,您可以根據需要爲數據結構使用Ruby,並使用指向同一對象的兩個散列鍵。請注意,如果您通過數據序列化進行往返,則可能無法保留該屬性,並且如果將新對象分配給其中一個鍵,則不會保留該屬性。

相關語言的語義是:

  1. Ruby的變量是對對象的引用。
  2. 賦值給變量,數組元素或散列鍵不會複製對象,它會在變量中存儲新的引用。
  3. 使用一個對象作爲參數的方法不創建一個副本,它通過一個參考
  4. 許多對ArrayHashString方法將創建並返回新對象。有兩種方法出現一些方法,例如mapmap!,其中前一版本返回一個新對象,後者更改該對象。
  5. 有一些例外情況:在作業中以及傳遞給方法時被複制的「立即」對象。這包括內置的數字類型。
+0

我沒有機會檢查第二部分,但第一部分我的意思是一個散列,其值是引用而不是其鍵的引用。 –

+0

@ Mouse.The.Lucky.Dog我沒有在我的答案中提到鑰匙作爲參考 - 對不起,如果有什麼措辭不好或令人困惑。任何Ruby對象都可以用作散列鍵,所有Ruby變量都是引用,但這不是「將引用用作散列鍵」。相反,Ruby安排如果兩個對象被認爲是相等的,他們將會產生相同的散列碼。因此,Ruby將把兩個*不同的*字符串對象作爲相同的哈希鍵,並將相同的內容'a =「hello」'和'b =「hello」作爲對象,並將不同的內容(在不同的時間)作爲兩個不同的鍵。 –