2012-02-28 91 views
9

我經常發現自己在Ruby中構建查找表,通常用於緩存一些昂貴的計算或構建一些我傳遞給視圖的東西。我認爲這必須有一個簡短易讀的成語,但我們無法想到其中一個。例如,假設我要開始Ruby數組到索引散列?

[65, 66, 67, ...] 

,並最終與

{65 => "A", 66 => "B", 67 => "C", ...} 

的未挺,漂亮,足夠的成語,我們能想到的包括:

array = (65..90).to_a 

array.inject({}) {|hash, key| hash[key]=key.chr; hash} 
{}.tap {|hash| array.each {|key| hash[key] = key.chr}} 
Hash[array.zip(array.map{|key| key.chr})] 

但所有這些都有點痛苦:難以閱讀,容易混淆,意圖不明確。當然,Ruby(或某些Rails助手)對此有一些不錯的魔力?

回答

21

什麼

Hash[(65..90).map { |i| [i, i.chr] }] 

我覺得這是很明顯的,自我解釋。另外,我並不存在一種更簡單的方法來解決這個相當具體的任務,但Ruby不幸與Python中的dict理解沒有任何可比性。如果你願意,你可以使用Facets寶石,其中包括一些關閉:

require 'facets' 
(65..90).mash { |i| [i, i.chr] } 
+1

哇。我從來不會猜到一堆數組將會以這種方式被解釋。我預料它會變成{[65,「A」] => [66,「B」],[67,「C」] => [68,「D」],...}。這讓我感到害怕,但我仍然會使用它。謝謝! – 2012-02-28 01:52:57

+3

@William:你可以使用['Hash。[]'](http://apidock.com/ruby/Hash/%5B%5D/class)兩種形式:Hash [key,value,key,value, ...]或'Hash [[[key,value],[key,value],...]]',內部數組表示任何可枚舉的yield/key對。請記住,在Ruby中,有不止一個要做到這一點:P另外,我使用方面增加了另一個建議。 – 2012-02-28 01:56:05

+0

果然。在那裏的文檔。謝謝!我一定會檢查出Facets;看起來很棒。 – 2012-02-28 02:01:15