2012-02-24 10 views
19

Tengo una serie de cadenas, y quiero hacer un hash fuera de ella. Cada elemento de la matriz será la clave, y quiero que el valor se calcule a partir de esa clave. ¿Hay una forma Ruby de hacer esto?matriz de Ruby para hash: cada elemento de la clave y derivar valor de ella

Por ejemplo:

['a','b'] para convertir a {'a'=>'A','b'=>'B'}

+0

¿Las cadenas son únicas? ¿Qué pasa si no lo son? ¿Quieres una excepción? –

+0

sí, serán únicos. Si no lo son, haría un uniq antes de eso. – lulalala

Respuesta

49

Puede:

a = ['a', 'b'] 
Hash[a.map {|v| [v,v.upcase]}] 
+4

esto ciertamente funciona ... pero no creo que sea el * más * eficiente ... estás iterando dos veces en este caso. No es una preocupación, por supuesto, con una variedad de longitud 2, pero vale la pena señalar. – brad

4

he aquí una solución ingenua y sencilla que convierte el carácter actual a un símbolo que se utilizará como clave. Y solo por diversión, capitaliza el valor. :)

h = Hash.new 
['a', 'b'].each {|a| h[a.to_sym] = a.upcase} 
puts h 

# => {:a=>"A", :b=>"B"} 
1

No estoy seguro si este es el verdadero camino de Ruby, pero debe ser lo suficientemente cerca:

hash = {} 
['a', 'b'].each do |x| 
    hash[x] = x.upcase 
end 

p hash # prints {"a"=>"A", "b"=>"B"} 

En función tendríamos esto:

def theFunk(array) 
    hash = {} 
    array.each do |x| 
    hash[x] = x.upcase 
    end 
    hash 
end 


p theFunk ['a', 'b', 'c'] # prints {"a"=>"A", "b"=>"B", "c"=>"C"} 
3

cual sea la forma que míralo, necesitarás iterar la matriz inicial. Aquí hay otra manera:

a = ['a', 'b', 'c'] 
h = Hash[a.collect {|v| [v, v.upcase]}] 
#=> {"a"=>"A", "b"=>"B", "c"=>"C"} 
21
%w{a b c}.reduce({}){|a,v| a[v] = v.upcase; a} 
+0

¡Me gusta su solución! ¡Muy resbaladizo! –

0

Ésta es otra manera:

a.zip(a.map(&:upcase)).to_h 

#=>{"a"=>"A", "b"=>"B"} 
1

método de Ruby each_with_object es una clara forma de hacer lo que quiere

['a', 'b'].each_with_object({}) { |k, h| h[k] = k.upcase } 
Cuestiones relacionadas