2011-01-17 26 views
13

Tengo una matriz de Ruby como estoCómo convertir un número entero de rubí en un símbolo

q_id = [1,2,3,4,5,...,100] 

Quiero iterar a través de la matriz y se convierten en un hash como esto

{ 
    :1 => { #some hash} , 
    :2 => { #another hash}, 
    ... 
    :100 => {#yet another hash} 
} 

¿Cuál es el la forma más corta y elegante de lograr esto?

[EDITAR: el to_s.to_sym aunque es práctico no es como lo quiero. Disculpas por no mencionar lo anterior]

+0

No creo que eso sea legal. Intenta escribir ': 1' en' irb' y obtendrás un error de sintaxis. – detunized

+0

Como se menciona a continuación,: 1 no es válido. Lo mejor que puedes obtener es: "1". No estoy seguro de por qué esto importa tanto, ya que las comillas no son realmente "parte" del símbolo ... pero es cómo debe definirse por razones de análisis/gramática. –

+3

Quizás debería mostrarnos lo que realmente está tratando de lograr. ¿Por qué siente que necesita números como símbolos para las teclas de su Hash? ¿Cómo va a indexar el hash más adelante o, si lo itera, qué hará con las claves? – Phrogz

Respuesta

26

Para crear un símbolo, ya sea de estos trabajos:

42.to_s.to_sym 
:"#{42}" 

El #inspect representación de estos espectáculos :"42" sólo porque :42 no es un símbolo válido literal. Tenga la seguridad de que las comillas dobles no son parte del símbolo en sí.

Para crear un hash, no hay razón para convertir las claves en símbolos, sin embargo. Usted simplemente debe hacer esto:

q_id = (1..100).to_a 
my_hash_indexed_by_value = {} 
q_id.each{ |val| my_hash_indexed_by_value[val] = {} } 

O esto:

my_hash = Hash[ *q_id.map{ |v| [v,{}] }.flatten ] 

O esto:

# Every time a previously-absent key is indexed, assign and return a new hash 
my_hash = Hash.new{ |h,val| h[val] = {} } 

Con todos estos a continuación, puede indexar su picadillo directamente con un entero y obtener una único hash atrás, por ejemplo

my_hash[42][:foo] = "bar" 

A diferencia de JavaScript, donde cada clave de un objeto debe ser una cadena, hashes en Ruby aceptar cualquier objeto como la clave.

+0

¡Gracias por la detallada explicación! – papdel

+1

':" 42 "' funciona igual de bien que ':" # {42} "' –

+0

@AndrewGrimm bien, sí; Asumía que se usaría una variable en lugar del '42', pero supongo que podría no estar claro para los recién llegados. Gracias por aclararlo. – Phrogz

0

u puede utilizar 1.to_s.to_sym

pero esto hará que los símbolos como:. "1"

+0

ver el comentario anterior – papdel

3

Para traducir un entero en un símbolo, utilice to_s.to_sym. Por ejemplo:

1.to_s.to_sym

Tenga en cuenta que un símbolo está más relacionado con una cadena que con un número entero. Puede que ya no sea tan útil para cosas como clasificar.

+0

Será ':" 1 "' not ': 1'. – detunized

+0

Derecha, agregué una aclaración. Gracias por mencionarlo. –

+0

Sí, como mencionó Andy, estoy buscando una forma de convertirlo a: 1 y no: "1". Ya se descartó el método directo to_sym – papdel

1

Como ya se ha indicado,: 1 no es un símbolo válido. He aquí una manera de hacer lo que está queriendo, pero con las teclas como cadenas:

Hash[a.collect{|n| [n.to_s, {}] }] 
1

Una matriz de los objetos que desee en su picadillo sería mucho más fácil de usar, no es cierto? Incluso un hash de enteros funcionaría bastante bien, ¿no?

0

En realidad, los "números de símbolo" no son algo en Ruby (intente llamar al método to_sym en un número). El beneficio de usar símbolos en un hash es sobre el rendimiento, ya que siempre tienen el mismo object_id (intente llamar al object_id en cadenas, booleanos, números y símbolos).

Los números tienen un valor inmediato y, como los objetos Symbol, siempre tienen el mismo object_id.

De todos modos, el uso de la nueva sintaxis de hash implica el uso de símbolos como claves, pero siempre se puede usar el viejo bueno "cohete de hash" sintaxis

awesome_hash = { 1 => "hello", 2 => "my friend" }

Lea sobre los valores inmediatos aquí:

https://books.google.de/books?id=jcUbTcr5XWwC&pg=PA73&lpg=PA73&dq=immediate+values+singleton+method&source=bl&ots=fIFlAe8xjy&sig=j7WgTA1Cft0WrHwq40YdTA50wk0&hl=en&sa=X&ei=0kHSUKCVB-bW0gHRxoHQAg&redir_esc=y#v=onepage&q&f=false

Cuestiones relacionadas