Antes de profundizar en el proceso de conversión, primero identifiquemos la diferencia entre los dos: el hash y la estructura. Esto nos permitirá ayudar a responder la pregunta de por qué algunos prefieren usar la estructura en lugar del hash en Ruby.
Diferenciar hash de estructura
Hash es la colección de pares clave-valor y es lo mismo que Array, excepto por el hecho de que la indexación se realizó a través de claves arbitrarias de cualquier tipo de objetos (no el índice entero). Un orden en el que se atraviesa un hash por valor o clave puede parecer arbitrario y, en general, puede no estar en el orden de intersección. Por otro lado, struct es el tipo de forma más conveniente para agrupar la cantidad de atributos. Esto es mediante los métodos de acceso sin necesidad de escribir clases explícitas.
Struct permitirá generar una instancia con un conjunto de descriptores de acceso y esto parece poderoso y conveniente para el usuario. Aunque el hachís puede hacer cosas similares, tiene algunos inconvenientes que quizás no te gusten. La estructura es más fácil de entender, lo que llevará a los usuarios a una codificación más fácil de mantener. Además, vale la pena señalar que struct supera al hash en lo que respecta a la velocidad de recuperación de datos, lo que le permitirá saber que struct puede ser una mejor opción en comparación con el hash para la configuración a la que se debe acceder de manera repetida en tiempo de ejecución.
Convirtiendo Hash en Estructura en Ruby
Dado que conocemos los dos, muchos tal vez prefieran usar struct en lugar de hash. Pero lo que queremos centrarnos aquí es que, detrás del bajo rendimiento que ofrece el hash, todavía pueden resultar ventajosos. Si no puede usarlo por sí solo, conviértalo en estructura para poder lograr una mejor usabilidad.
Si ya ha definido la estructura y desea iniciar la conversión de hash a estructura, podemos ayudarlo utilizando los siguientes métodos en un ejemplo dado a continuación. Si desea convertir has en una estructura en Ruby, digamos, por ejemplo, que tenemos un valor dado de:
h = { :a => 1, :b => 2 } y desea tener una estructura como: sa == 1 sb == 2
Para convertir, puede realizar cualquiera de estos métodos:
Método de conversión 1:
En este método, el resultado aparecerá como OpenStruct y no específicamente como struct:
palanca (principal)> requiere 'ostruct' palanca (principal)> s = OpenStruct.new(h) => # palanca (principal)> pone sa, sb 1 2
Método de conversión 2:
Si ya tiene una estructura definida y desea comenzar algo con un hash, puede seguir esto:
Persona = Struct.new(:first_name, :apellido, :edad) person_hash = { first_name: "Foo", last_name: "Bar", edad: 29 } persona = Person.new(*person_hash.values_at(*Person.members) ) => #
Método de conversión 3:
Dado que el orden de las claves hash estaba garantizado en Ruby 1.9+, puedes seguir esto:
s = Struct.new(*(k = h.keys)).new(*h.values_at(*k))
El ejemplo de conversión de hash a estructura que proporcionamos puede ayudar, pero si desea una idea más amplia, acuda a profesionales para obtener ayuda formal.