Was ist der Unterschied zwischen einer Zeichenfolge und einem Symbol in Ruby und wann sollten Sie eine über der anderen verwenden?Was ist der Unterschied zwischen einer Zeichenkette und einem Symbol in Ruby?
Antwort
Der Hauptunterschied besteht darin, dass mehrere Symbole, die einen einzelnen Wert darstellen, identisch sind, während dies bei Strings nicht der Fall ist. Zum Beispiel:
irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618
3 Verweise auf das Symbol: Test, alle das gleiche Objekt.
irb(main):010:0> "test".object_id
=> -605770378
irb(main):011:0> "test".object_id
=> -605779298
irb(main):012:0> "test".object_id
=> -605784948
3 Verweise auf die Zeichenfolge "test", alle verschiedenen Objekte.
Dies bedeutet, dass die Verwendung von Symbolen abhängig von der Anwendung möglicherweise ein gutes Stück Speicher sparen kann. Es ist auch schneller, Symbole für Gleichheit zu vergleichen, da sie dasselbe Objekt sind. Der Vergleich identischer Zeichenfolgen ist viel langsamer, da die Zeichenfolgenwerte verglichen werden müssen und nicht nur die Objekt-IDs.
Soweit zu verwenden, wenn die, wie ich Strings in der Regel für außer Dinge fast alles verwenden wie Hash-Schlüssel, wo ich wirklich eine eindeutige Kennung wollen, kein String.
Ein Symbol wird zur Darstellung von Namen und Strings verwendet. Sie sollten ein Symbol verwenden, wenn Sie eine Zeichenfolge möglicherweise mehrmals verwenden müssen, da dies einfacher und produktiver ist.
Und dies über google gefunden, die näher bieten kann: Here you go
Symbole und Zeichenketten sind völlig verschieden this post einen kleinen Einblick in die Unterschiede hat. Wann und wo sie zu verwenden sind, gibt es eine ziemlich umfangreiche Post zu diesem Thema über has many :through.
Als Kontrapunkt, ein Freund von mir vor kurzem schrieb a post titled "Ruby Rant" die Ruby Symbole ein anderes Aussehen verleiht.
Symbole können sehr nützlich sein und bieten eine bessere Leistung als Optionen, die andere Sprachen bieten, aber, wie fast alles andere, kann auch missbraucht werden. Punkt 4a zu: APIs können eine große PITA sein, aber dies wird in Ruby 1.9, wo Symbole unter anderem direkt mit Strings verglichen werden können, weitgehend adressiert. –
Ein weiterer Unterschied zwischen String
und Symbol
ist, dass ein String
viel mehr Methoden für String-Manipulation hat, während ein Symbol
ein relativ mageres Objekt ist.
Schauen Sie sich die Dokumentation für die und die Symbol
class.
Strings sind Mutable, Symbole arre unveränderlich
Hinweis: Veränderliche Objekte nach Zuordnung geändert werden kann, während können unveränderliche Objekte nur http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/
Symbol ist unveränderlich und String sind wandelbar überschrieben.
Wenn wir irgendeine Operation an einer Zeichenfolge ausführen, dann erstellt sie ein neues Objekt und nimmt eine Messung vor. Da wir mehr und mehr Operationen an Saiten durchführen, verbrauchen wir mehr und mehr Speicher.
Symbol Objekt, das unveränderlich Mittel sind, wenn wir alle Vorgänge ausführen es dann in Originalobjekt Änderungen durchführen, es wird kein Objekt erstellen, das ist, warum es mehr rentabel ist.
für weitere Informationen, können Sie click here
Was sind die Unterschiede zwischen den Symbolen & Strings?
- Symbole sind unveränderlich: Ihr Wert bleibt konstant.
- Mehrere Verwendungen desselben Symbols haben die gleiche Objekt-ID und sind das gleiche Objekt im Vergleich zur Zeichenkette, die jedes Mal ein anderes Objekt mit eindeutiger Objekt-ID sein wird.
- Sie können keine der String-Methoden wie #upcase, #split on Symbols aufrufen.
Von Understanding Differences Between Symbols & Strings in Ruby
Wenn Sie chinesisch sind, können Sie auch lesen 理解 Ruby Symbol
Es gibt zwei Hauptunterschiede zwischen Streich- und Symbol in Ruby.
String ist wandelbar und Symbol ist nicht
Da der String wandelbar ist, es Änderung irgendwo sein kann und auf das Ergebnis ist nicht richtig führen kann.
Symbol ist unveränderlich.
String ist ein Objekt, so dass es die Speicherzuordnung
setzt "abc" .object_id # 70322858612020
puts "abc" .object_id # 70322846847380
puts "abc" benötigt. object_id # 70322846815460
In der anderen Hand, Symbol wird th Das gleiche Objekt:
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
Also wird der String mehr Zeit zu verwenden und zu vergleichen als Symbol.
Sie können mehr here lesen, um zu verstehen:
Die Aussage
foo = "bar"
im Speicher ein neues Objekt erstellt.Wenn wir die Aussage
foo = "bar"
Wir schaffen ein anderes Objekt
, um es deutlicher bitte versuchen Sie den Code unten auf Rubin Konsole
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
wiederholen erhalten Sie eine Ausgabe wie
string bar with object id = 70358547221180
string bar with object id = 70358548927060
was deutlich zeigt, gibt es zwei verschiedene Objekte für die gleiche Zeichenfolge. Nun, wenn Sie Symbol verwenden wird es ein Objekt pro Symbol erstellen so
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
zeigt
symbol bar with object id = 7523228
symbol bar with object id = 7523228
was bedeutet, es gibt nur ein Objekt für: Bar
weitere Symbole sind unveränderlich und Sie können keine der String-Methoden wie #upcase, #split
auf Symbole aufrufen.
Vergleichen Symbole sind schneller als Strings vergleichen.
Symbole können als konstante/unveränderliche Zeichenfolgen betrachtet werden, die eine eindeutige Gruppe bilden, die effektiv in Speicherzeiger auf dem Heap konvertiert werden. Das bedeutet, dass der Vergleich von zwei Symbolen schnell ist, weil Sie nur 2 ganze Zahlen (Speicherzeiger) vergleichen.
Zeichenfolgen sind veränderbar, so dass der Speicherzeiger auf ihren Wert auf dem Heap nach der Änderung geändert werden kann. Dies bedeutet, dass Vergleichsoperationen langsamer sind, da Duplikate existieren können, die semantisch äquivalent sind.
Verwendet
Verwendung Symbol
, wenn Sie sicher sind, dass der Wert konstant bleiben wird. Beispiel Verwenden Sie Symbole für Hash-Schlüssel, Verwenden Sie Zeichenfolge, wenn Sie den Wert ändern oder String-Methode verwenden möchten.
Symbole werden vom Garbage Collector nicht bereinigt und bleiben bis zum Ende der Laufzeitinstanz bestehen. Wenn Sie also viele Symbole deklarieren, verschwenden Sie möglicherweise viel Speicher. – Daemin
@Daemin: Dies ist normalerweise kein Problem, es sei denn, Sie erstellen dynamisch Symbole in Massen. Dies ist die Ursache für Speicherballon in einigen Apps. Wenn Sie in Ihrem Code fest codierte Symbole verwenden, sind Sie relativ sicher. – Pistos
Ich bin mir nicht sicher, ob ich deinen ersten Satz verstehe. Wenn Leute sagen, dass jede Schneeflocke einzigartig ist, bedeutet das, dass jeder anders ist. Jedes Vorkommen unterscheidet sich von dem anderen. In Ihrem Symbolcode-Beispiel zeigen Sie jedoch jedes Vorkommen als exakt dasselbe Objekt an. Wäre "identisch" kein besseres Wort? –