Sono totalmente nuovo nel mondo Ruby e sono un po confuso con il concetto di Simboli. Qual è la differenza tra simboli e variabili? Perché non usare solo variabili?
Grazie.
Commenti
- in Lisp – da cui deriva Ruby – un simbolo è essenzialmente il tipo di dati per una variabile; ciò significa che puoi manipolare il programma in modo da riflesso mentre viene eseguito (non la spiegazione più coerente, scusa)
Risposta
Variabili e 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 deve essere creata solo una copia di un simbolo. Quindi, se tu have
x = :my_str y = :my_str
:my_str
verrà creato solo una volta e x
e y
puntano alla stessa area di memoria. Daltra parte, se hai
x = "my_str" y = "my_str"
a stringa contiene my_str
verrà creato due volte e x
e y
punterà a istanze diverse.
Di conseguenza, i simboli sono spesso usati come equivalenti alle enumerazioni in Ruby, così come le chiavi di un dizionario (hash).
Commenti
- Solo per spingere il punto di @mipadi ', quando confronti una stringa devi confrontare ogni carattere luno con laltro. Quindi, il confronto di stringhe identiche è O (n). Mentre i simboli rubino confrontano i riferimenti agli oggetti, la strega è O (1).
- Perché Python non ha questo?
- Dovresti stare attento a non abusarne anche, poiché, lultima volta che lo sapevo, ma non ho ' esaminato questo aspetto in ruby > 1.9, simboli don ' t get gc ' d e così possono consumare memoria
- Si comportano in modo identico in Smalltalk, tranne che sembrano
#mySymbol
. - @ frogstarr78 – A meno che tu non stia generando programmaticamente simboli (internando stringhe senza prima controllarle), non ' devi preoccuparti di creare troppi simboli.
Risposta
Il simbolo 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, ad esempio
order.status = :canceled order.status = :confirmed
Tu può anche considerare il simbolo come enumerazione istantanea. Non è necessario definire un simbolo, basta usarlo. Questo articolo lo spiega in dettaglio.
Commenti
- Spiegazione migliore della maggior parte dei ' che mi sembra finora.
Risposta
Di solito, le variabili tendono a essere confuse con le stringhe, ma posso capire che la pensi come una variabile. È comprensibile. Pensala in questo modo:
Lo stato di un giocatore in una partita è rappresentato da un numero. 1 significa vivo, 2 significa insicuro, 3 significa morto. Questo può essere facilmente sostituito da simboli. I simboli potrebbero essere :alive
:unsure
e :dead
. Per verificare se un giocatore è vivo, invece di farlo:
if player_status == 1
Potresti farlo:
if player_status == :alive