2012-04-24 8 views

risposta

4

In un rubino Hash di serie non sono la stessa (string vs symbol)

Tuttavia, i binari SessionHash sottoclasse chiama to_s sui tasti prima di riporli, in modo da tutte le chiavi sono memorizzate come stringhe (anche se si specifica un simbolo):

class SessionHash < Hash 

    def [](key) 
    load_for_read! 
    super(key.to_s) 
    end 

    def []=(key, value) 
    load_for_write! 
    super(key.to_s, value) 
    end 

Ecco perché session[:test] e session["test"] tornerà lo stesso valore in rotaie.

+1

Il problema di base è che non si desidera convertire stringhe tainate in simboli, poiché i simboli non vengono raccolti automaticamente. – Reactormonk

+1

una cosa che ho notato oggi. I miei valori di sessione sono accessibili da stringhe non da chiavi di simboli. Mentre i param stanno lavorando anche con i simboli. Sto usando ruby ​​1.9.2 e rails 3.2.13 –

+0

Il collegamento 'stringa vs simbolo' è rotto: / – brandaemon

0

No, non sono la stessa è una stringa l'altro è un simbolo

Si dovrebbe usare la seconda forma, il simbolo è qualcosa di usato per rappresentare qualcosa che altrimenti sarebbe una stringa. È un modo per avere nomi descrittivi in ​​modo efficiente mentre si salva lo spazio che si utilizzerà per generare una stringa più volte.

Ciò significa che non si crea una nuova istanza ogni volta che si fa riferimento al simbolo come si farebbe con una stringa. Il simbolo è semplicemente un modo migliore per rappresentare il valore che stai descrivendo.

Solo per completezza, dovrei menzionare che un simbolo può essere trasformato banalmente in una stringa se è necessaria una rappresentazione in un secondo momento.

se volete leggere di più c'è un lungo post sul blog just here che spiega bene i simboli rubino. Basti dire che sono una optomizzazione.

0

No, non sono esattamente gli stessi. Sono due modi per realizzare la stessa cosa.

In generale, in Ruby l'uso principale dei simboli è come chiavi. I simboli sono :these_things. Le chiavi di hash sono un tipico utilizzo per loro ...

{ 
    :name => 'Mary', 
    :rank => 'Captain' 
} 

Anche le chiavi di sessione sono di solito simboli.

Utilizzare le stringhe invece non farà male a nulla, ma i simboli sono più tipici.