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?
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.
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.
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:
Antworten:
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
:my_str
wird nur einmal erstelltx
undy
verweist auf denselben Speicherbereich. Auf der anderen Seite, wenn Sie habeneine Zeichenfolge , die
my_str
erstellt wird zweimal , undx
undy
auf 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.
quelle
#mySymbol
.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
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.
quelle
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
:unsure
und 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
quelle