Recherche…


Syntaxe

  • :symbole
  • :'symbole'
  • :"symbole"
  • "symbole" .to_sym
  • % s {symbole}

Remarques

Avantages de l'utilisation de symboles sur des chaînes:

1. Un symbole Ruby est un objet avec une comparaison O (1)

Pour comparer deux chaînes, nous devons potentiellement examiner chaque caractère. Pour deux chaînes de longueur N, cela nécessitera des comparaisons N + 1

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"

Mais puisque chaque apparition de: foobar fait référence au même objet, nous pouvons comparer des symboles en examinant les ID d'objet. Nous pouvons le faire avec une seule comparaison. (O (1))

def symbol_compare sym1, sym2
  sym1.object_id == sym2.object_id
end
symbol_compare :foobar, :foobar

2. Un symbole Ruby est une étiquette dans une énumération de forme libre

En C ++, nous pouvons utiliser des «énumérations» pour représenter des familles de constantes associées:

enum BugStatus { OPEN, CLOSED };
BugStatus original_status = OPEN;
BugStatus current_status  = CLOSED;

Mais comme Ruby est un langage dynamique, nous ne nous soucions pas de la déclaration d'un type BugStatus ou du suivi des valeurs légales. Au lieu de cela, nous représentons les valeurs d'énumération sous forme de symboles:

original_status = :open
current_status  = :closed

3. Un symbole Ruby est un nom unique et constant

En Ruby, on peut changer le contenu d'une chaîne:

"foobar"[0] = ?b # "boo"

Mais nous ne pouvons pas changer le contenu d'un symbole:

:foobar[0]  = ?b # Raises an error

4. Un symbole Ruby est le mot-clé d'un argument de mot-clé

Lorsque vous transmettez des arguments à une fonction Ruby, nous spécifions les mots-clés à l'aide de symboles:

# Build a URL for 'bug' using Rails.
url_for :controller => 'bug',
        :action => 'show',
        :id => bug.id

5. Un symbole Ruby est un excellent choix pour une clé de hachage

En règle générale, nous utiliserons des symboles pour représenter les clés d'une table de hachage:

options = {}
options[:auto_save]     = true
options[:show_comments] = false

Créer un symbole

La manière la plus courante de créer un objet Symbol est de préfixer l'identificateur de chaîne avec un signe deux-points:

:a_symbol       # => :a_symbol
:a_symbol.class # => Symbol

Voici quelques moyens de définir un Symbol , en combinaison avec un littéral String :

:"a_symbol"
"a_symbol".to_sym

Les symboles ont également une séquence %s qui prend en charge des délimiteurs arbitraires similaires à la façon dont %q et %Q fonctionnent pour les chaînes:

%s(a_symbol)
%s{a_symbol}

Le %s est particulièrement utile pour créer un symbole à partir d'une entrée contenant des espaces blancs:

%s{a symbol} # => :"a symbol"

Bien que certains symboles intéressants ( :/ :[] :^ , etc.) puissent être créés avec certains identificateurs de chaîne, notez que les symboles ne peuvent pas être créés avec un identificateur numérique:

:1 # => syntax error, unexpected tINTEGER, ...
:0.3 # => syntax error, unexpected tFLOAT, ...

Les symboles peuvent se terminer par un seul ? ou ! sans avoir besoin d'utiliser un littéral de chaîne comme identifiant du symbole:

:hello?  # :"hello?" is not necessary.
:world!  # :"world!" is not necessary.

Notez que toutes ces différentes méthodes de création de symboles renverront le même objet:

:symbol.object_id == "symbol".to_sym.object_id
:symbol.object_id == %s{symbol}.object_id

Depuis Ruby 2.0, il existe un raccourci pour créer un tableau de symboles à partir de mots:

%i(numerator denominator) == [:numerator, :denominator]

Conversion d'une chaîne en symbole

Donné une String :

s = "something"

il existe plusieurs façons de le convertir en Symbol :

s.to_sym
# => :something
:"#{s}"
# => :something

Conversion d'un symbole en chaîne

Donné un Symbol :

s = :something

Le moyen le plus simple de le convertir en String est d'utiliser la méthode Symbol#to_s :

s.to_s
# => "something"

Une autre façon de procéder consiste à utiliser la méthode Symbol#id2name , alias de la méthode Symbol#to_s . Mais c'est une méthode unique à la classe Symbol :

s.id2name
# => "something"


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow