Ruby Language
Symbole
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"