2012-02-28 49 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