2011-08-11 14 views
6

¿Cuál es la forma más sencilla de convertir el rango 1..10 en un hash del siguiente formato?Ruby/Rails: Convertir un rango en un hash

{ 
    1 => '£1', 
    2 => '£2', 
    # ... 
} 

que han intentado hacer esto con map, pero terminan con una serie de valores hash en lugar de una sola hash.

Gracias.

Respuesta

12
Hash[(1..10).map { |num| [num, "£#{num}"] }] 

o

(1..10).inject({}) { |hash, num| hash[num] = "£#{num}"; hash } 

o en Ruby 1,9

(1..10).each_with_object({}) { |num, hash| hash[num] = "£#{num}" } 
+1

Métodos como 'each_with_object' recordarme lo mucho que amo Rubí! +1 –

+0

Perfecto, gracias! – gjb

+1

necesita CAMBIAR | hash, num | to | num, hash | en ese último ejemplo ... else obtiene NoMethodError: método indefinido '[] = 'para 1: Fixnum – jpwynn

2

¿Qué tal:

h = {} 
(1..10).each {|x| h[x] = "£#{x}"} 
+4

Regla general: cada vez que declara un valor vacío (hash o matriz) y luego itera sobre la colección para completar/sumar, use 'inject' – iafonov

+1

@ iafonov..for array, puede usar' map'. – rubyprince

+0

@iafonov Me doy cuenta de que esta es una publicación anterior, pero vi tu comentario (y soy nuevo para Ruby), y me dejó preguntándome * por qué * deberías usar 'inject'. No estoy diciendo que sea incorrecto ni nada, solo me gustaría entender las razones detrás de esto, ya que el enfoque 'cada' anterior es fácil de leer y comprender, y según tengo entendido, hace el trabajo. – Thor84no

1

otra manera

h = Hash.new { |hash, key| hash[key] = "£#{key}" } 

cada elemento tendrá valor apropiado Hovever también responderá a h[100] lo que podría causar errores

Cuestiones relacionadas