2016-03-01 48 views
0

紅寶石如何讓您不明白地使用字符串或符號引用元素?這經常會讓我受不了,特別是在處理JSON時。做使用符號鍵與字符串鍵引用哈希元素

hash = {stat: bar} 

允許通過hash[:stat]的參考。以後,如果我這樣做:

hash = JSON.parse(hash.to_json) 
hash[:stat] 

,將返回nil,而是我必須做hash['stat']。這是爲什麼?這是故意的,如果是這樣,爲什麼?

+1

如果您確實想要使用其中一種,您可以安裝ActiveSupport gem,並使用它的'HashWithIndiferentAccess'。 – Amadan

+0

當然這是故意的。爲什麼如果Ruby不區分它們,首先會有字符串和符號? – sawa

回答

2

JSON沒有符號。對於屬性名稱,它只有字符串。當你將一個鍵/值對序列化到一個JSON對象時,你會失去關於鍵是否以字符串或符號開始生命的信息,這個鍵只是一個字符串。將對象反序列化爲Ruby數據結構時,唯一理智的選擇是對鍵使用字符串。

+0

好的,謝謝!這更有意義。所以最後一件事情 - 在我的示例中,在我序列化爲JSON之前,爲什麼當密鑰是符號時調用字符串鍵是非法的? – dude0faw3

+1

這不是「非法」的。你只是沒有給該鍵分配一個值,這意味着它將返回默認值,除非你將它設置爲不同的值,否則它是'nil'。 –

+0

因此''stat'和''stat''可以共存嗎? – dude0faw3

-2

符號被解析爲json的字符串,但解析爲哈希的json會將其視爲字符串。如果你要使用它,最好是凍結字符串而不是使用符號。

4

哈希將關鍵對象映射到值對象。如果將值對象與關鍵對象關聯,則可以通過該關鍵對象檢索它。如果您將某個值與不同的鍵對象關​​聯,則可以通過該不同的鍵對象檢索該值。傳遞一個關鍵對象並獲取不同關鍵對象的值是錯誤的。

舉個例子,下面的哈希:

hsh = {:foo => 42, 'foo' => 23, [:foo] => :bar, ['foo'] => :baz} 

你會如何檢索或者4223如果僅僅紅寶石不管三七二十一開始了完全不同的鍵返回值?