Symbole sind benannte Bezeichner, mit denen auf einen Wert verwiesen werden kann.
Symbole werden über ein Symbol-Literal erstellt, indem man einem Namen ein : voranstellt, z. B. :foo.
Sie können auch mit Anführungszeichen geschrieben werden, z. B. :"foo", was zum Beispiel Leerzeichen im Namen erlaubt.
:foo # => :foo
:"foo boo" # => :"foo boo"
Symbole werden an vielen Stellen in der Sprache verwendet, unter anderem als Schlüssel in Hashes, um Methodennamen und Variablennamen darzustellen.
Was Symbole von Strings unterscheidet, ist, dass sie Bezeichner sind und keine Daten oder Text darstellen. Das bedeutet, dass zwei Symbole mit demselben Namen immer dasselbe Objekt sind.
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
Symbole sind unveränderlich, das heißt, sie können nicht verändert werden. Wenn du also ein Symbol „veränderst“, erstellst du in Wirklichkeit ein neues Symbol. Es gibt ein paar Methoden, mit denen du Symbole bearbeiten kannst, und sie geben alle neue Symbole zurück. Alle Methoden findest du in der Symbol-API.
:foo.upcase # => :FOO
:foo.object_id # => 1086748
:foo.upcase.object_id # => 60
Der Vorteil unveränderlicher Symbole ist, dass sie speichereffizienter als Strings sind und als Bezeichner außerdem sicherer zu verwenden sind.
Symbole können in Strings und umgekehrt umgewandelt werden.
Das kann nützlich sein, wenn du ein Symbol verändern willst oder wenn du ein Symbol als String verwenden willst.
Um einen String als Symbol darzustellen, kannst du die Methode String#to_sym verwenden, und für das Gegenteil die Methode Symbol#to_s.
Da Symbole nur eine begrenzte Menge an Methoden haben, kann es nützlich sein, ein Symbol in einen String umzuwandeln, um String-Methoden darauf anzuwenden, wenn ein neues Symbol benötigt wird.
:foo.to_s # => "foo"
"foo".to_sym # => :foo
In Ruby kannst du Namen im Gültigkeitsbereich ermitteln, indem du verschiedene Methoden verwendest, um die Namen von Konstanten, Methoden und Variablen zu erhalten. Diese Methoden geben Arrays von Symbolen zurück.
Einige Methoden sind Module#constants, Module#instance_methods, Module#class_variables, global_variables und local_variables.
module Foo
BAR = 1
def self.baz; end
end
a = 1
Foo.constants # => [:BAR]
Foo.instance_methods # => [:baz]
local_variables # => [:a]
Alle Methoden findest du in der Kernel-API und der Module-API.