2017-01-06 22 views
0

如果使用符號1我爲什麼要使用一個字符串)可以節省內存,2)具有更好的訪問時間爲什麼即使使用字符串的哈希值,如果符號存在

我看到有時字符串用於有時候符號的代碼。爲什麼你會選擇帶符號的所有優點的字符串?

好吧,您的訪問鍵通常不會是字符串,因此您始終可以鍵入鑄件。但是,那麼爲什麼演員不會隱含地發生?

+0

當引用鍵的東西總是以字符串開頭時,我認爲值得把它們保存爲字符串。另外,我最近不得不使用整數作爲鍵。他們無法作爲符號投射(據我所知)。 –

+0

擁有一個數字作爲密鑰實際上是一個好點 – Michael

+3

你知道密鑰可以是任何東西,對吧?類,字符串,數組,哈希,符號,特效,...爲什麼要爲字符串做一個特殊的例外? –

回答

2

有不同的權衡,

  • 符號最好用於有界密鑰的集合,是理想限於在源代碼中發現的值。
  • 字符串最適用於從用戶輸入或其他外部源獲取的無限組密鑰,例如處理非結構化JSON數據時。

爲什麼?

在Ruby 2.2符號未被垃圾收集之前,處理無限制的密鑰顯然會導致內存泄漏。但即使車庫收藏,仍然需要「實習」所有字符串輸入以將其轉化爲符號,這是一項巨大的成本。因此,如果代碼從文本文件或Web中消耗字符串,只使用字符串鍵可以是最聰明的。

3

我看到有時使用字符串,有時使用符號的代碼。爲什麼你會選擇帶符號的所有優點的字符串?

在Ruby 2.2中添加了Symbol GC之前,在運行時生成符號會導致長時間運行的應用程序發生內存泄漏。使用字符串是一種避免這種記憶問題並獲得gc的方法,它圍繞着ruby生態系統。通過凍結字符串支持,在某些時候符號和字符串將是相同的。

好吧,您的訪問鍵通常不會是字符串,因此您總是可以輸入鑄件。但是,那麼爲什麼演員不會隱含地發生?

散列將對象映射到對象。這個:

{"a"=>1, :a=>1} 

是一個有效的散列。

如果您想隱式投射,您可以使用ActiveSupport中的HashWithIndifferentAccess

+0

哇..unexpected – Michael

+0

在哪種情況下,你想要一個密鑰訪問「a」和:a ..聽起來更像是一個前衛的邊緣案例,導致更多的麻煩,而不是解決問題 – Michael

+0

最後一句話是誤導性的「與凍結的字符串支持,在某些時候符號和字符串將是相同的」 - 符號和不可變的字符串之間有很大的區別,保證只是':abc'的一個實例,但是可以有許多''abc''的實例,因此也是將字符串內聯到符號的重要運行時間工作。在某些應用程序中,這仍然是一個非常有效的參數,以便更喜歡字符串鍵 – akuhn