Ruby Language
simboli
Ricerca…
Sintassi
- :simbolo
- :'simbolo'
- :"simbolo"
- .to_sym "simbolo"
- % s {simbolo}
Osservazioni
Vantaggi dell'uso di simboli su stringhe:
1. Un simbolo Ruby è un oggetto con confronto O (1)
Per confrontare due stringhe, è potenzialmente necessario esaminare ogni carattere. Per due stringhe di lunghezza N, ciò richiederà N + 1 confronti
def string_compare str1, str2
if str1.length != str2.length
return false
end
for i in 0...str1.length
return false if str1[i] != str2[i]
end
return true
end
string_compare "foobar", "foobar"
Ma poiché ogni aspetto di: foobar si riferisce allo stesso oggetto, possiamo confrontare i simboli osservando gli ID oggetto. Possiamo farlo con un solo confronto. (O (1))
def symbol_compare sym1, sym2
sym1.object_id == sym2.object_id
end
symbol_compare :foobar, :foobar
2. Un simbolo Ruby è un'etichetta in un'enumerazione in formato libero
In C ++, possiamo usare "enumerazioni" per rappresentare famiglie di costanti correlate:
enum BugStatus { OPEN, CLOSED };
BugStatus original_status = OPEN;
BugStatus current_status = CLOSED;
Ma poiché Ruby è un linguaggio dinamico, non ci preoccupiamo di dichiarare un tipo di BugStatus o di tenere traccia dei valori legali. Invece, rappresentiamo i valori di enumerazione come simboli:
original_status = :open
current_status = :closed
3. Un simbolo di Ruby è un nome costante e univoco
In Ruby, possiamo cambiare il contenuto di una stringa:
"foobar"[0] = ?b # "boo"
Ma non possiamo cambiare il contenuto di un simbolo:
:foobar[0] = ?b # Raises an error
4. Un simbolo di Ruby è la parola chiave per un argomento di parole chiave
Quando si passano gli argomenti delle parole chiave a una funzione Ruby, si specificano le parole chiave usando i simboli:
# Build a URL for 'bug' using Rails.
url_for :controller => 'bug',
:action => 'show',
:id => bug.id
5. Un simbolo rubino è una scelta eccellente per un tasto cancelletto
In genere, utilizzeremo i simboli per rappresentare le chiavi di una tabella hash:
options = {}
options[:auto_save] = true
options[:show_comments] = false
Creare un simbolo
Il modo più comune per creare un oggetto Symbol
è il prefisso dell'identificatore di stringa con due punti:
:a_symbol # => :a_symbol
:a_symbol.class # => Symbol
Ecco alcuni modi alternativi per definire un Symbol
, in combinazione con un letterale String
:
:"a_symbol"
"a_symbol".to_sym
I simboli hanno anche una sequenza %s
che supporta delimitatori arbitrari simili a come %q
e %Q
funzionano per le stringhe:
%s(a_symbol)
%s{a_symbol}
Il %s
è particolarmente utile per creare un simbolo da un input che contiene uno spazio bianco:
%s{a symbol} # => :"a symbol"
Mentre alcuni simboli interessanti ( :/
:[]
:^
, ecc.) Possono essere creati con determinati identificatori di stringa, si noti che i simboli non possono essere creati usando un identificatore numerico:
:1 # => syntax error, unexpected tINTEGER, ...
:0.3 # => syntax error, unexpected tFLOAT, ...
I simboli possono finire con un singolo ?
o !
senza bisogno di usare una stringa letterale come identificativo del simbolo:
:hello? # :"hello?" is not necessary.
:world! # :"world!" is not necessary.
Nota che tutti questi diversi metodi di creazione dei simboli restituiscono lo stesso oggetto:
:symbol.object_id == "symbol".to_sym.object_id
:symbol.object_id == %s{symbol}.object_id
Dal momento che Ruby 2.0 c'è una scorciatoia per creare una serie di simboli dalle parole:
%i(numerator denominator) == [:numerator, :denominator]
Conversione di una stringa in un simbolo
Dato una String
:
s = "something"
ci sono diversi modi per convertirlo in un Symbol
:
s.to_sym
# => :something
:"#{s}"
# => :something
Conversione di un simbolo in stringa
Dato un Symbol
:
s = :something
Il modo più semplice per convertirlo in una String
consiste nell'utilizzare il metodo Symbol#to_s
:
s.to_s
# => "something"
Un altro modo per farlo è utilizzare il metodo Symbol#id2name
, che è un alias per il metodo Symbol#to_s
. Ma è un metodo unico per la classe Symbol
:
s.id2name
# => "something"