2012-02-28 45 views
9

A menudo me encuentro creando tablas de búsqueda en Ruby, generalmente para almacenar en caché algunos cálculos costosos o para construir algo que estoy pasando a una vista. Me imagino que debe haber un lenguaje corto y legible para esto, pero no pudimos pensar en uno. Por ejemplo, supongamos que quiero comenzar conmatriz de Ruby a un hash indexado?

[65, 66, 67, ...] 

y terminar con

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

Los no-absolutamente-bastante-suficientes modismos podríamos pensar incluyen:

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

Pero todos estos son un poco dolorosos: difíciles de leer, fáciles de estropear, no claros en el intento. Seguramente Ruby (o algún ayudante de Rails) tiene algo de magia para esto?

Respuesta

21

¿Qué hay de

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

Creo que esto es bastante obvio y autoexplicativo. Además, no existe una forma mucho más simple de resolver esta tarea bastante específica, por desgracia, Ruby no tiene algo comparable a la comprensión dict en Python. Si lo desea, puede usar la gema Facets, que incluye algo cercano:

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

Wow. Nunca hubiera adivinado que un grupo de pares de arreglos habría sido interpretado de esa manera. Hubiera esperado que se convirtiera en {[65, "A"] => [66, "B"], [67, "C"] => [68, "D"], ...}. Eso me asusta un poco, pero aún así lo usaré. ¡Gracias! –

+3

@William: Puede usar ['Hash. []'] (Http://apidock.com/ruby/Hash/%5B%5D/class) en dos formas: 'Hash [clave, valor, clave, valor, ...] 'o' Hash [[[clave, valor], [clave, valor], ...]] 'con la matriz interna representando cualquier par de claves de clave/valor enumerable. Recuerde que en Ruby, hay más de uno para hacerlo: P Además, agregué otra sugerencia usando facetas. –

+0

Efectivamente. Justo ahí en los documentos. ¡Gracias! Definitivamente también revisaré Facets; se ve muy bien. –

Cuestiones relacionadas