2012-02-28 25 views
9

ルビーでルックアップテーブルを構築することが多く、一般的には高価な計算をキャッシュしたり、ビューに渡すものを構築したりすることがよくあります。私はこれのための短い、可読なイディオムがなければならないと思うが、私達は考えることができなかった。例えば、私たちが考えることができ、非常に-プリティ十分ではないイディオムが含まインデックス付きハッシュへの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ヘルパー)はこれにいくつか素晴らしい魔法を持っていますか?私は、これは非常に明白と自己説明だと思う

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

について何

答えて

21

。また、私はこのかなり特殊なタスクを解決するもっと簡単な方法はありませんが、残念ながらPythonのdictの理解に匹敵するものはありません。あなたが望むなら、近くに何かを含むFacetsの宝石を使うことができます:

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

うわー。私は決して配列の束の束がそのように解釈されているとは思わなかったでしょう。私はそれが{[65、 "A"] => [66、 "B"]、[67、 "C"] => [68、 "D"]、...}に変わることを期待していたでしょう。それは私を少し恐れるが、私はまだそれを使用します。ありがとう! –

+3

@William: '' Hash [[] '](http://apidock.com/ruby/Hash/%5B%5D/class)は二つの形式で使うことができます:'ハッシュ[キー、値、キー、値、 ...]または 'Hash [[key、value]、[key、value]、...]]'を返します。 Rubyには、それ以上のことがいくつかあります:Pまた、ファセットを使って別の提案を追加しました。 –

+0

右のドキュメントにあります。ありがとう!私は間違いなくファセットもチェックアウトします。素晴らしく見える。 –

関連する問題