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"


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow