Was ist ein Symbol in Ruby?


45

Ich bin völlig neu in der Ruby-Welt und ein bisschen verwirrt mit dem Konzept der Symbole. Was ist der Unterschied zwischen Symbolen und Variablen? Warum nicht einfach Variablen verwenden?

Vielen Dank.


In Lisp, von dem Ruby abgeleitet ist, ist ein Symbol im Wesentlichen der Datentyp für eine Variable. Das heißt, Sie können das Programm während der Ausführung reflexionsartig bearbeiten. (Nicht die kohärenteste Erklärung, sorry)
Paul Nathan

Antworten:


70

Variablen und Symbole sind verschiedene Dinge. Eine Variable verweist auf verschiedene Arten von Daten. In Ruby ähnelt ein Symbol eher einer Zeichenfolge als einer Variablen.

In Ruby ist eine Zeichenfolge veränderlich, während ein Symbol unveränderlich ist. Das bedeutet, dass nur eine Kopie eines Symbols erstellt werden muss. Also, wenn Sie haben

x = :my_str
y = :my_str

:my_strwird nur einmal erstellt xund yverweist auf denselben Speicherbereich. Auf der anderen Seite, wenn Sie haben

x = "my_str"
y = "my_str"

eine Zeichenfolge , die my_strerstellt wird zweimal , und xund yauf verschiedene Instanzen verweisen.

Daher werden Symbole häufig als Entsprechung zu Enums in Ruby sowie als Schlüssel für ein Wörterbuch (Hash) verwendet.


1
Nur um @ mipadis Punkt zu betonen: Wenn Sie eine Zeichenfolge vergleichen, müssen Sie jedes Zeichen miteinander vergleichen. Der Vergleich identischer Zeichenfolgen ist also O (n). Während Rubinsymbole Objektreferenzen mit O (1) vergleichen.
Jeremy Heiler

Warum hat Python das nicht?
Job

Sie sollten übermäßigen Gebrauch sie nicht auch vorsichtig sein, da ich endlich wusste, aber ich habe nicht in diese in Ruby sah> 1,9, Symbole werden nicht gc'd und kann so auffressen Speicher
frogstarr78

Sie verhalten sich in Smalltalk identisch, außer sie sehen aus wie #mySymbol.
Frank Shearar

@ frogstarr78 - Wenn Sie nicht programmgesteuert Symbole generieren (Zeichenfolgen internieren, ohne sie vorher zu überprüfen), müssen Sie sich keine Sorgen machen, dass zu viele Symbole erstellt werden.
Justin L.

16

Symbol in Ruby ist im Grunde dasselbe wie Symbol in der realen Welt. Es wird verwendet, um etwas darzustellen oder zu benennen.

Symbole werden sehr häufig verwendet, um beispielsweise einen Zustand darzustellen

order.status = :canceled
order.status = :confirmed

Sie können das Symbol auch als Instant Enum betrachten. Sie müssen kein Symbol definieren, sondern verwenden es nur. Dieser Artikel erklärt es ausführlich.


1
Bessere Erklärung als die meisten, die ich bisher gesehen habe.
Juri Ghensev

0

Normalerweise neigen Variablen dazu, mit Zeichenfolgen verwechselt zu werden, aber ich kann verstehen, dass Sie es wie eine Variable denken. Es ist verständlich. Denk darüber so:

Der Status eines Spielers in einem Spiel wird durch eine Zahl dargestellt. 1 bedeutet lebendig, 2 bedeutet unsicher, 3 bedeutet tot. Dies kann leicht durch Symbole ersetzt werden. Die Symbole könnten :alive :unsureund sein :dead. So überprüfen Sie, ob ein Spieler am Leben ist:

if player_status == 1

Sie könnten dies tun:

if player_status == :alive

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.