Suche…


Syntax

  • :Symbol
  • :'Symbol'
  • :"Symbol"
  • "symbol" .to_sym
  • % s {Symbol}

Bemerkungen

Vorteile der Verwendung von Symbolen über Strings:

1. Ein Ruby-Symbol ist ein Objekt mit O (1) -Vergleich

Um zwei Zeichenfolgen zu vergleichen, müssen wir möglicherweise alle Zeichen betrachten. Für zwei Zeichenfolgen der Länge N sind N + 1-Vergleiche erforderlich

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"

Da jedoch jedes Auftreten von: foobar auf dasselbe Objekt verweist, können wir Symbole vergleichen, indem Sie die Objekt-IDs betrachten. Wir können dies mit einem einzigen Vergleich tun. (O (1))

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

2. Ein Ruby-Symbol ist ein Label in einer Freiform-Aufzählung

In C ++ können wir "Enumerationen" verwenden, um Familien verwandter Konstanten darzustellen:

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

Da Ruby eine dynamische Sprache ist, müssen wir uns nicht darum kümmern, einen BugStatus-Typ zu deklarieren oder die gesetzlichen Werte zu verfolgen. Stattdessen stellen wir die Aufzählungswerte als Symbole dar:

original_status = :open
current_status  = :closed

3. Ein Ruby-Symbol ist ein konstanter, eindeutiger Name

In Ruby können wir den Inhalt einer Zeichenfolge ändern:

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

Aber wir können den Inhalt eines Symbols nicht ändern:

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

4. Ein Ruby-Symbol ist das Schlüsselwort für ein Schlüsselwortargument

Beim Übergeben von Schlüsselwortargumenten an eine Ruby-Funktion geben wir die Schlüsselwörter mithilfe von Symbolen an:

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

5. Ein Ruby-Symbol ist eine ausgezeichnete Wahl für einen Hash-Schlüssel

Normalerweise verwenden wir Symbole, um die Schlüssel einer Hash-Tabelle darzustellen:

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

Ein Symbol erstellen

Die gebräuchlichste Methode zum Erstellen eines Symbol Objekts besteht darin, dem String-Bezeichner einen Doppelpunkt voranzustellen:

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

Es gibt einige Möglichkeiten, ein Symbol in Kombination mit einem String Literal zu definieren:

:"a_symbol"
"a_symbol".to_sym

Symbole haben auch eine %s Sequenz, die beliebige Begrenzungszeichen unterstützt, ähnlich wie %q und %Q für Strings funktionieren:

%s(a_symbol)
%s{a_symbol}

Das %s ist besonders nützlich, um aus einer Eingabe ein Leerzeichen zu erstellen:

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

Einige interessante Symbole ( :/ :[] :^ usw.) können mit bestimmten String-Bezeichnern erstellt werden. Beachten Sie jedoch, dass Symbole nicht mit einem numerischen Bezeichner erstellt werden können:

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

Symbole können mit einem einzigen Zeichen enden ? oder ! ohne ein String-Literal als Bezeichner des Symbols verwenden zu müssen:

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

Beachten Sie, dass alle diese verschiedenen Methoden zum Erstellen von Symbolen dasselbe Objekt zurückgeben:

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

Seit Ruby 2.0 gibt es eine Verknüpfung zum Erstellen eines Arrays von Symbolen aus Wörtern:

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

Umwandlung eines Strings in ein Symbol

Eine String :

s = "something"

Es gibt mehrere Möglichkeiten, es in ein Symbol zu konvertieren:

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

Ein Symbol in einen String konvertieren

Ein Symbol :

s = :something

Die einfachste Methode zum Konvertieren in einen String ist die Verwendung der Methode Symbol#to_s :

s.to_s
# => "something"

Eine andere Möglichkeit besteht darin, die Methode Symbol#id2name verwenden, die ein Alias ​​für die Methode Symbol#to_s ist. Es ist jedoch eine Methode, die nur für die Symbol Klasse gilt:

s.id2name
# => "something"


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow