2012-02-28 10 views
9

Często znajduję siebie w tabelach wyszukiwania budynków w języku Ruby, zwykle w celu buforowania kosztownych obliczeń lub tworzenia czegoś, co przechodzę do widoku. Sądzę, że musi istnieć krótki, czytelny idiom, ale nie mogliśmy o tym myśleć. Na przykład, załóżmy, że chcę zacząćTablica ruby ​​do indeksowanego skrótu?

[65, 66, 67, ...] 

i skończyć z

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

nie-całkiem-całkiem-wystarczająco dużo idiomów moglibyśmy myśleć obejmują:

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})] 

Ale wszystkie te są trochę bolesne: trudne do odczytania, łatwe do zepsucia, niewyraźne w zamierzeniu. Z pewnością Ruby (lub jakiś pomocnik Railsów) ma w tym coś fajnego?

Odpowiedz

21

Co

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

myślę, że to jest dość oczywiste i samo-wyjaśniający. Ponadto, nie istnieje o wiele prostszy sposób rozwiązania tego dość specyficznego zadania, Ruby niestety nie ma czegoś porównywalnego ze zrozumieniem dyktowania w Pythonie. Jeśli chcesz, możesz użyć klejnotu Facets, który zawiera coś bliskiego:

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

Wow. Nigdy bym nie przypuszczał, że kilka par macierzy zostanie zinterpretowanych w ten sposób. Spodziewałam się, że zamieni się w {[65, "A"] => [66, "B"], [67, "C"] => [68, "D"], ...}. Trochę mnie to przeraża, ale nadal będę z niego korzystał. Dzięki! –

+3

@William: Możesz użyć ['Hash. []'] (Http://apidock.com/ruby/Hash/%5B%5D/class) w dwóch postaciach: 'Hash [klucz, wartość, klucz, wartość, ...] 'lub' Hash [[[klucz, wartość], [klucz, wartość], ...]] 'z wewnętrzną tablicą reprezentującą dowolne przeliczalne plonujące pary klucz/wartość. Pamiętaj, że w Ruby jest więcej niż jeden: P Ponadto dodałem kolejną sugestię używając aspektów. –

+0

Rzeczywiście. Właśnie tam w dokumentach. Dzięki! Na pewno sprawdzę również Facety; wygląda świetnie. –