Cos'è un simbolo in Ruby?


45

Sono totalmente nuovo nel mondo di Ruby e sono un po 'confuso con il concetto di simboli. Qual è la differenza tra simboli e variabili? Perché non usare solo le variabili?

Grazie.


in Lisp - da cui deriva Ruby - un simbolo è essenzialmente il tipo di dati per una variabile; ciò significa che è possibile manipolare il programma in modo riflesso mentre viene eseguito. (non la spiegazione più coerente, scusa)
Paul Nathan,

Risposte:


70

Le variabili e i simboli sono cose diverse. Una variabile punta a diversi tipi di dati. In Ruby, un simbolo è più simile a una stringa che a una variabile.

In Ruby, una stringa è mutabile, mentre un simbolo è immutabile. Ciò significa che è necessario creare una sola copia di un simbolo. Quindi, se hai

x = :my_str
y = :my_str

:my_strverrà creata una sola volta, e xe yscegliere la stessa area di memoria. D'altra parte, se hai

x = "my_str"
y = "my_str"

una stringa contenente my_strverrà creato due volte , ed xe ypunterà a istanze diverse.

Di conseguenza, i simboli sono spesso usati come l'equivalente degli enum in Ruby, così come le chiavi di un dizionario (hash).


1
Solo per spingere il punto di @mipadi, quando si confronta una stringa è necessario confrontare ogni personaggio l'uno contro l'altro. Quindi, confrontando stringhe identiche è O (n). Considerando che i simboli del rubino confrontano i riferimenti agli oggetti strega è O (1).
Jeremy Heiler,

Perché Python non ha questo?
Giobbe

Dovresti fare attenzione a non abusarne anche, dal momento che, lo sapevo per ultimo, ma non l'ho esaminato in ruby> 1.9, i simboli non vengono controllati e quindi possono consumare memoria
frogstarr78

Si comportano in modo identico in Smalltalk, tranne che sembrano #mySymbol.
Frank Shearar,

@ frogstarr78 - A meno che tu non stia generando programmaticamente simboli (internando le stringhe senza prima verificarle), non devi preoccuparti di creare troppi simboli.
Justin L.,

16

Symbol in Ruby è fondamentalmente la stessa cosa del simbolo nel mondo reale. È usato per rappresentare o nominare qualcosa.

I simboli sono molto comunemente usati per rappresentare un qualche tipo di stato, per esempio

order.status = :canceled
order.status = :confirmed

Puoi anche guardare il simbolo come enum istantaneo. Non è necessario definire un simbolo, basta usarlo. Questo articolo lo spiega in dettaglio.


1
Una spiegazione migliore della maggior parte di quanto sembri finora.
Yuri Ghensev,

0

Di solito, le variabili tendono a essere confuse con le stringhe, ma posso capire che la pensi come una variabile. È comprensibile. Pensare in questo modo:

Lo stato di un giocatore in una partita è rappresentato da un numero. 1 significa vivo, 2 significa incerto, 3 significa morto. Questo può essere facilmente sostituito da simboli. I simboli potrebbero essere :alive :unsuree :dead. Per verificare se un giocatore è vivo, invece di farlo:

if player_status == 1

Potresti farlo:

if player_status == :alive

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.