2008-10-31 7 views

Antwort

69

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.

+8

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

+5

@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

+2

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? –

1

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

0

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.

0

Als Kontrapunkt, ein Freund von mir vor kurzem schrieb a post titled "Ruby Rant" die Ruby Symbole ein anderes Aussehen verleiht.

+0

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. –

3

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.

0

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

9

Was sind die Unterschiede zwischen den Symbolen & Strings?

  1. Symbole sind unveränderlich: Ihr Wert bleibt konstant.
  2. 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.
  3. 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

0

Es gibt zwei Hauptunterschiede zwischen Streich- und Symbol in Ruby.

  1. 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.

  2. 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:

2

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.