Symbole sind benannte Bezeichner, mit denen du auf einen Wert verweisen kannst.
Symbole werden über ein Symbol-Literal erstellt, indem du einem Namen ein :-Zeichen voranstellst, 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 zu repräsentieren.
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 ein Symbol also „veränderst“, erstellst du in Wirklichkeit ein neues Symbol. Es gibt einige 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 der Unveränderlichkeit von Symbolen ist, dass sie speichereffizienter als Strings sind, aber als Bezeichner auch sicherer zu verwenden.
Symbole können in Strings umgewandelt werden und umgekehrt.
Das kann nützlich sein, wenn du ein Symbol verändern möchtest 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 über eine begrenzte Auswahl an Methoden verfügen, kann es nützlich sein, ein Symbol in einen String umzuwandeln, um darauf String-Methoden anzuwenden, wenn ein neues Symbol benötigt wird.
:foo.to_s # => "foo"
"foo".to_sym # => :foo
Der Hafen von Palermo ist ein geschäftiger Hafen, in dem viele Schiffe kommen und gehen. Seit Langem gibt es dort ein manuelles System, um die Schiffe zu erfassen, die sich gerade im Hafen befinden. Dieses System ist sehr fehleranfällig, und der Hafenchef hat beschlossen, es durch ein computergestütztes System zu ersetzen.
Der Hafenchef hat dich damit beauftragt, das neue System umzusetzen. Das System muss Kennungen für Schiffe verwalten, aber auch für Ziele.
Als Erstes musst du die Kennung für den Hafen von Palermo erstellen. Die Kennung besteht aus den ersten vier Buchstaben des Hafennamens in Großbuchstaben.
Definiere die Konstante Port::IDENTIFIER als Symbol mit dem Wert :PALE.
Port::IDENTIFIER
# => :PALE
Das Programm muss auch andere Häfen verwalten, also musst du auch für sie Kennungen erstellen. Der Hafen möchte das System automatisieren, und da Häfen unterschiedliche Namenskonventionen verwenden, sollten die Kennungen aus dem Namen des Hafens erzeugt werden. Die Kennung besteht aus den ersten vier Buchstaben des Hafennamens in Großbuchstaben.
Definiere die Methode Port.get_identifier, die einen String als Argument entgegennimmt und die Kennung für diesen Hafen als Symbol zurückgibt.
Port.get_identifier("Hamburg")
# => :HAMB
Der Hafen hat zwei Terminals, und das System muss bestimmen, an welchem Terminal ein Schiff anlegen soll. Das Terminal wird durch die Kennung des Schiffes bestimmt.
Die Kennung besteht aus 2 Teilen: Der erste Teil besteht aus 3 Großbuchstaben, die angeben, welche Fracht das Schiff transportiert, danach folgen 3 Zahlen, die eindeutige Kennung des Schiffes.
Wenn das Schiff OIL oder GAS geladen hat, soll es am Terminal A anlegen. Andernfalls soll das Schiff am Terminal B anlegen.
Definiere die Methode Port.get_terminal, die ein Symbol als Argument entgegennimmt, nämlich die Kennung des Schiffes.
Die Methode sollte das Terminal als Symbol zurückgeben.
Port.get_terminal(:OIL123)
# => :A
Melde dich bei Exercism an, um Ruby mit 21 Konzepte121 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.