sintax rails form escape ruby hashmap

ruby - rails - Uso de enteros como claves hash



haml to html (4)

¿Es apropiado usar enteros como claves en un hash de Ruby?

Cada ejemplo de la documentación muestra una cadena o símbolo que se utiliza como una clave, pero nunca un número entero.

Internamente, ¿los enteros se convertirían de alguna manera en cadenas? He visto alguna información conflictiva sobre el tema.

En otras palabras, ¿hay alguna desventaja significativa en el uso de claves enteras para un hash?


El único requisito para usar un objeto como clave hash es que debe responder al hash del mensaje con un valor hash, y el valor hash para una clave determinada no debe cambiar. Por ejemplo, si llamas a esto:

1.hash()

Puedes ver que el número 1 responde al mensaje hash


Es posible que a otras personas que observan las respuestas aquí les resulte interesante saber que ocurre una excepción cuando se usan números enteros como claves de símbolos en un hash de Ruby {symbol: value}

hash = {1: ''one''} # will not work hash = {1 => ''one''} # will work

Explicación solicitada:

La respuesta más sencilla de por qué el primer ejemplo falla es que to_sym no es un método que se haya implementado para los enteros Fixnum .

Para profundizar y quizás explicar por qué es eso, uno de los principales beneficios de usar símbolos es que dos símbolos son, de hecho, "el mismo objeto". O al menos comparten las mismas identificaciones de objeto.

:foo.object_id == :foo.object_id => true

Las cadenas que son iguales no comparten los mismos objetos y, por lo tanto, no comparten los mismos identificadores de objeto.

"foo".object_id == "foo".object_id => false

Al igual que los símbolos, los enteros Fixnum que son iguales tendrán los mismos identificadores de objeto. Por lo tanto, no es necesario convertirlos en símbolos.

one = 1 => 1 uno = 1 => 1 one.object_id => 3 one.object_id == uno.object_id => true


Ya hay respuestas sobre el ¿ is it possible? .

Una explicación, por qué no hay ejemplos con enteros como Hash-keys.

Hash-keys tienen (la mayoría de las veces) un significado. Puede ser un nombre de atributo y su valor (por ejemplo, :color => ''red'' ...).

Cuando tiene un entero como clave, su semántica puede ser ''primero, segundo ...'' (1). Pero luego no usas un hash, sino una matriz para almacenar tus valores.

(1) Un contraejemplo puede ser una clave foránea en una base de datos.


por supuesto puedes usar enteros como claves ...

h = {1 => ''one'', 2 => ''two'', 3 => ''three''} (1..3).each do |i| puts h[i] end

=>

one two there

¡IRB ES TU AMIGO! intentalo..

De hecho, puedes usar cualquier objeto Ruby como la clave (o el valor). Por lo general, no pensamos en usar Hashes de esta manera, pero podría ser bastante útil.