Definizione del simbolo in Ruby

1

Sono un principiante in Ruby e sto cercando di avvolgere la mia testa attorno ai simboli. Diresti che la mia attuale comprensione, riassunta nella seguente (eccessivamente semplificata) definizione, è vera per la maggior parte degli scopi?

"Un simbolo è una costante di stringa e il suo nome è anche il suo contenuto."

E se questo è vero, perché non usiamo solo costanti di stringa al suo posto?

( Che cos'è un simbolo in Ruby? è un duplicato , ma le risposte non erano al 100% chiare per me e non posso commentare lì a causa della scarsa reputazione)

    
posta FlatronL1917 23.12.2018 - 10:48
fonte

1 risposta

1

La mia opinione è che devi considerare come viene creato, rappresentato e referenziato il simbolo sottostante. in confronto a una Stringa . Perché?

Bene, sia Symbols che Strings appaiono simili nella descrizione, tuttavia l'applicazione e la rappresentazione interna dei computer di essi è diversa in modo univoco.

  • Una stringa viene utilizzata per memorizzare un valore stringa, il valore può essere modificato dopo la creazione.

  • Un simbolo viene utilizzato per memorizzare un valore stringa, il valore non può essere modificato dopo la creazione. Tutti i riferimenti al simbolo puntano alla stessa posizione in memoria.

Se si copia un simbolo si hanno due nomi ma una posizione di memoria, se si copia una stringa l'operazione di assegnazione crea un nuovo oggetto di memoria e copia il contenuto dell'oggetto stringa nella memoria del secondo oggetto di memoria. Pertanto, hai due nomi e due posizioni di memoria.

irb(main):002:0> symbol = :symbol
=> :symbol
irb(main):003:0> symbol.object_id
=> 824028
irb(main):004:0> symbol2 = symbol
=> :symbol
irb(main):005:0> symbol2.object_id
=> 824028

Un simbolo ha solo un'istanza di memoria da indicare. Ora consideriamo una stringa:

irb(main):006:0> stringName = "Fred"
=> "Fred"
irb(main):007:0> stringName.object_id
=> 70308031841340
irb(main):008:0> stringName2 = stringName
=> "Fred"
irb(main):009:0> stringName2.object_id
=> 70308031841340
irb(main):010:0> stringName2 = "Frederick"
=> "Frederick"
irb(main):011:0> stringName.object_id
=> 70308031841340
irb(main):012:0> stringName2.object_id
=> 70308032061840
irb(main):013:0> stringName2 = "Fred"
=> "Fred"
irb(main):014:0> stringName.object_id
=> 70308031841340
irb(main):015:0> stringName2.object_id
=> 70308032090380
irb(main):016:0> stringName
=> "Fred"
irb(main):017:0> stringName2
=> "Fred"

come puoi vedere la stringa su copia crea un nuovo oggetto in memoria che è una copia del primo. Non appena si modifica il contenuto, viene creato un nuovo oggetto in memoria per memorizzare la stringa univoca dalla prima istanza, anche se la stringa è la stessa. (cioè "Fred")

Perché usare i simboli?

I simboli sono molto più efficienti nell'uso della memoria rispetto alle stringhe. Inoltre, sono applicabili in modo univoco agli articoli di riferimento a cui si desidera fare riferimento nel codice. Una volta creati sono garantiti per rimanere lo stesso.

Spero che quanto sopra ti guida nella giusta direzione.

    
risposta data 23.12.2018 - 19:10
fonte

Leggi altre domande sui tag