2011-01-17 14 views
13

ho una serie di Ruby come questoCome convertire un intero rubino in un simbolo

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

voglio scorrere l'array e convertire in un hash come questo

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

Qual è il il modo più breve ed elegante per realizzare questo?

[EDIT: il to_s.to_sym pur essendo a portata di mano non è come lo voglio. Scuse per non menzionare in precedenza]

+0

Non penso che sia legale. Prova a digitare ': 1' in' irb' e otterrai un errore di sintassi. – detunized

+0

Come indicato di seguito,: 1 non è valido. Il meglio che puoi ottenere è: "1". Non sono sicuro del perché questo sia così importante, dato che le virgolette non sono realmente "parte" del simbolo .. ma è come deve essere definito per ragioni di analisi/grammatica. –

+3

Forse dovresti mostrarci cosa stai cercando di realizzare. Perché ritieni di aver bisogno di numeri-come-simboli per le chiavi del tuo Hash? Come procederai all'indicizzazione dell'hash, o se lo itererai, cosa farai con le chiavi? – Phrogz

risposta

26

Per la creazione di un simbolo, uno di questi lavori:

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

La #inspect rappresentazione di questi spettacoli :"42" solo perché :42 non è un simbolo valida letterale. Siate certi che le virgolette non fanno parte del simbolo stesso.

Per creare un hash, non vi è alcun motivo per convertire le chiavi in ​​simboli, tuttavia. Si dovrebbe fare semplicemente questo:

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

O questo:

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

O questo:

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

Con tutti questi si può quindi indicizzare il tuo hash direttamente con un intero e ottenere un hash indietro unico, es

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

A differenza di JavaScript, in cui ogni chiave ad un oggetto deve essere una stringa, hash in Ruby accettano qualsiasi oggetto come la chiave.

+0

Grazie per la dettagliata spiegazione !! – papdel

+1

':" 42 "' funziona altrettanto bene come ':" # {42} "' –

+0

@AndrewGrimm beh, sì; Supponevo che sarebbe stata usata una variabile al posto di "42", ma suppongo che potrebbe non essere chiara ai nuovi arrivati. Grazie per il chiarimento. – Phrogz

0

u possibile utilizzare 1.to_s.to_sym

ma questo renderà simboli come:. "1"

+0

vedi sopra commento – papdel

3

Per tradurre un intero in un simbolo, utilizzare to_s.to_sym. Ad esempio:

1.to_s.to_sym

Si noti che un simbolo è più correlato a una stringa di un numero intero. Potrebbe non essere più utile per cose come ordinare più.

+0

Sarà ':" 1 "' non ': 1'. – detunized

+0

Giusto, ho aggiunto un chiarimento. Grazie per segnalarlo. –

+0

Sì, come ha detto Andy, sto cercando un modo per convertirlo in: 1 e non: "1". Già escluso il metodo to_sym diretto – papdel

1

Come già indicato,: 1 non è un simbolo valido. Ecco un modo per fare quello che hai intenzione, ma con i tasti come stringhe:

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

Un array di oggetti che si desidera nel vostro hash sarebbe così molto più facile da usare, non è vero? Anche un hash di interi funzionerebbe abbastanza bene, non è vero?

0

In realtà "numeri simbolo" non sono una cosa in Ruby (prova a chiamare il metodo to_sym su un numero). Il vantaggio dell'uso dei simboli in un hash riguarda le prestazioni, poiché hanno sempre lo stesso object_id (prova a chiamare object_id su stringhe, booleani, numeri e simboli).

I numeri sono valori immediati e, come gli oggetti simbolo, hanno sempre lo stesso object_id.

In ogni caso, utilizzando la nuova sintassi hash implica utilizzando simboli come chiavi, ma si può sempre utilizzare il buon vecchio "hash razzo" sintassi

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

Leggi su valori immediati qui:

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

Problemi correlati