/ / Explicando los hashes en Ruby - ruby-on-rails, ruby

Explicando los hashes en Ruby - Ruby-on-Rails, Ruby

Estoy leyendo un libro Crafting Rails Applications byJosé Valim y me he topado con algo que no entiendo. Me pregunto si alguien puede explicar la diferencia en inglés simple entre los tres tipos de hash que se mencionan a continuación.

  1. Por ejemplo, de qué manera es el hash anidado (como se representa en este ejemplo) un hash anidado. En otros contextos, entiendo los hashes anidados, pero no los obtengo aquí.

  2. De qué manera es una "matriz" una "clave" en el segundo ejemplo. Para mí se parece a una matriz con cuatro variables.

  3. ¿De qué manera es el tercer ejemplo un hash con "hash como clave".

    @cached [clave] [prefijo] [nombre] [parcial]

    Hash simple con matriz como clave

    @cached [[clave, prefijo, nombre, parcial]]

    Hash simple con hash como clave.

    @cached [: key => key,: prefix => prefix,: name => name,: partial => partial]

Respuestas

6 para la respuesta № 1

El hash anidado, es bueno, un hash anidado. El ejemplo dado, @cached[key][prefix][name][partial], te está mostrando la "ruta" a un valor particular, por lo que en este caso el hash podría tener este aspecto:

@cache = {
key => {
prefix => {
name => {
partial => "value"
}
}
}
}

Para el hash simple con una matriz como clave, están utilizando esa matriz de 4 elementos como una de las claves de la clave.

@cache = {
[key, prefix, name, partial] => "value",
another_key => "another value"
}

Para el hash simple con hash como clave, están usando ese hash (tenga en cuenta que las {} "s para el hash son opcionales, lo que puede causar cierta confusión) como una de las claves en el hash.

@cache = {
{:key => key, :prefix => prefix, :name => name, :partial => partial} => "value",
another_key => "another value"
}

¡Espero que ayude!


2 para la respuesta № 2

Un hash simplemente asocia llave objetos para valor objetos. Las claves y los valores pueden ser cualquier cosa.

Si un valor El objeto es en sí mismo un hash, podría llamarlo "hash anidado" porque, en cierto sentido, está dentro del hash principal.

Si un llave objeto es una matriz, luego se obtiene un "hash con matriz como clave".

Si un llave el objeto es en sí mismo un hash, luego se obtiene un "hash con hash como clave".

Vea la respuesta de amfeng para una buena representación visual de estos diferentes casos.

Deberá estar familiarizado con la sintaxis de Ruby para identificar los diferentes casos cuando los vea.

Por ejemplo, para entender @cached[[key, prefix, name, partial]] necesitas saber eso [key, prefix, name, partial] representa una matriz, así que lo que tienes es como @cached[array], lo que significa que una matriz se está utilizando como una clave.

Cuando ves algo como @cached[key][prefix] usted debe saber que es equivalente a (@cached[key])[prefix] por lo que el objeto de valor (@cached[key]) es una especie de objeto que responde a la [] método. En este caso, es un hash anidado porque el autor te lo dijo, pero si no conoces ese contexto, es posible que sea otra cosa.

Cuando ves algo como @cached[:key => key, :prefix => prefix, :name => name, :partial => partial] deberias saberlo equivalente a @cached[{:key => key, :prefix => prefix, :name => name, :partial => partial}], lo que significa que estamos utilizando como hash como clave.