2011-06-21 12 views
6

Puedo crear un bloque que extraiga elementos hash y los convierta en variables locales, pero me pregunto si ya existe un método nativo. Algo como esto:¿Hay un equivalente de Ruby al extracto de PHP?

extract({ :foo => 'bar', :foo2 => 'bar2' }) 
puts foo # 'bar' 
puts foo2 # 'bar2' 

Tenga en cuenta que las claves son privadas, y que el alcance debe permanecer local.

+0

Sí, dragones, cierto. En este caso, menos dragones porque todos son privados y locales, y tratan con nombres de hash bastante repugnantes + toneladas de miembros. extracto no es necesario, pero bueno. – glortho

Respuesta

7

Puede acercarse:

bar, bar2 = h.values_at :foo, :foo2 

O supongo que podríamos extienda Hash para extraer en variables de instancia:

class Hash 
    def extract o 
    each { |k, v| o.instance_variable_set '@' + k.to_s, v } 
    end 
end 

h.extract self 

p [@foo, @foo2] 
+0

No estaba al tanto de esto, es bueno saberlo, gracias, pero con un montón de llaves no sería suficiente ahorro para que valga la pena, especialmente si cambias el nombre de una clave y luego lo cambias dos veces en esta tarea y nuevamente donde sea que la hayas usado. Puedes genérico los nombres de las variables locales, pero eso no es exactamente lo que estoy esperando. Puede que no sea posible, en cuyo caso ... ¡que así sea! – glortho

+0

Ok, lo actualicé con un enfoque completamente automatizado, pero viola su regla de alcance local. – DigitalRoss

+0

¡Práctico! Espero que esta pregunta nunca se responda completamente porque estoy aprendiendo todo tipo de trucos. :-) – glortho

1

Usted puede utilizar el método each para iterar a través de cada key=>value par:

{ :foo => 'bar', :foo2 => 'bar2' }.each do |key, value| 
    print key,"\t",value,"\n" 
end 

Salidas:

foo  bar 
foo2 bar2 
+0

Gracias, Teddy. Sé que puedo hacerlo en un bloque. Solo estoy buscando un método de mano corta. – glortho

Cuestiones relacionadas