it-swarm.com.de

Was ist der Unterschied zwischen einer Zeichenfolge und einem Symbol in Ruby?

Was ist der Unterschied zwischen einer Zeichenfolge und einem Symbol in Ruby und wann sollten Sie eine Zeichenfolge übereinander verwenden?

56
Readonly

Der Hauptunterschied besteht darin, dass mehrere Symbole, die einen einzelnen Wert darstellen, identisch sind, während dies bei Zeichenfolgen 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, alles 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 den String "test", alle verschiedenen Objekte.

Dies bedeutet, dass die Verwendung von Symbolen je nach Anwendung möglicherweise viel Speicherplatz sparen kann. Es ist auch schneller, Symbole auf Gleichheit zu vergleichen, da sie dasselbe Objekt sind. Der Vergleich identischer Zeichenfolgen ist viel langsamer, da die Zeichenfolgenwerte anstatt nur der Objekt-IDs verglichen werden müssen.

Soweit ich welche verwende, verwende ich normalerweise für fast alles Strings, mit Ausnahme von Hash-Schlüsseln, bei denen ich wirklich einen eindeutigen Bezeichner und keinen String möchte.

72
Robert Gamble

Was sind die Unterschiede zwischen Symbolen und Strings? 

  1. Symbole sind unveränderlich: Ihr Wert bleibt konstant.
  2. Mehrere Verwendungen desselben Symbols haben dieselbe Objekt-ID und sind dasselbe Objekt im Vergleich zu Zeichenfolge, die jedes Mal ein anderes Objekt mit eindeutiger Objekt-ID ist.
  3. Sie können keine der String-Methoden wie #split für Symbole aufrufen.

Von Unterschiede zwischen Symbolen und Strings in Ruby verstehen

Wenn Sie Chinesen sind, können Sie auch 理解 Ruby-Symbol lesen.

10
Feuda

Die Aussage 

foo = "bar"

erstellt ein neues Objekt im Speicher. Wenn wir die Aussage wiederholen 

foo = "bar"

Wir erstellen ein anderes Objekt 

um es klarer zu machen, probieren Sie bitte den folgenden Code auf der Ruby-Konsole

foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"

sie werden wie ausgegeben 

string bar with object id = 70358547221180
string bar with object id = 70358548927060

dies zeigt deutlich, dass es zwei verschiedene Objekte für dieselbe Zeichenfolge gibt. Wenn Sie nun ein Symbol verwenden, wird ein Objekt pro Symbol so erstellt

foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"

zeigt an 

symbol bar with object id = 7523228
symbol bar with object id = 7523228

was bedeutet, dass es nur ein Objekt für: bar gibt

weitere Symbole sind unveränderlich und Sie können keine der String-Methoden wie #upcase, #split für Symbole aufrufen.

Das Vergleichen von Symbolen ist schneller als das Vergleichen von Strings.  

Symbole können als konstante/unveränderliche Zeichenfolgen betrachtet werden, die eine eindeutige Menge bilden und effektiv in Speicherzeiger auf dem Heap umgewandelt werden. Dies bedeutet, dass der Vergleich von zwei Symbolen schnell ist, weil Sie nur 2 Ganzzahlen (Speicherzeiger) vergleichen. 

Zeichenfolgen sind veränderbar, sodass sich der Speicherzeiger auf den Wert auf dem Heap nach der Änderung ändern kann. Dies bedeutet, dass Vergleichsoperationen langsamer sind, weil Duplikate existieren können, die semantisch gleichwertig sind.

Verwendet

verwenden Sie Symbol, wenn Sie sicher sind, dass der Wert konstant bleibt. Verwenden Sie beispielsweise Symbole für Hash-Schlüssel. Verwenden Sie string, wenn Sie den Wert ändern oder die String-Methode verwenden möchten.

5
Nitin9791

Ein weiterer Unterschied zwischen String und Symbol besteht darin, dass eine String weit mehr Methoden für die String-Manipulation enthält, während eine Symbol ein relativ schlankes Objekt ist.

Schauen Sie sich die Dokumentation für die String-Klasse und die Symbol-Klasse an.

3
Grant Hutchins

Fall, in dem das Symbol ein Desaster sein kann. Nehmen wir an, Sie haben params.map(&:to_sym) in Ihrem Rails-Controller. Wenn Sie nun die vom Benutzer zur Verfügung gestellten Daten aus irgendeinem Grund in ein Symbol konvertieren, kann dies gefährlich werden. Wenn die vom Benutzer bereitgestellten Daten zu groß sind und wir wissen, dass das Symbol kein Garbage-Collector ist, kann es sein, dass der Speicher Ihres Servers aufgebraucht wird, wodurch Ihre Website beeinträchtigt werden kann.

1
Chimed Palden

Zeichenketten sind veränderlich, Symbole sind unveränderlich
Hinweis: Veränderliche Objekte können nach der Zuweisung geändert werden, während unveränderliche Objekte nur Überschrieben werden können. http://www.robertsosinski.com/2009/01/11/the -differenz-zwischen-ruby-symbole-und-strings/

1
Nitesh

Ein Symbol ist etwas, das Sie verwenden, um Namen und Zeichenfolgen darzustellen. Sie möchten ein Symbol verwenden, wenn Sie eine Zeichenfolge mehrmals verwenden müssen, da dies wesentlich einfacher und produktiver ist.

Und habe das gerade über google gefunden, was mehr Details bieten kann: Hier gehts

1
websch01ar

Es gibt zwei Hauptunterschiede zwischen String und Symbol in Ruby.

  1. String ist veränderlich und Symbol nicht

    • Da der String veränderbar ist, kann er irgendwo geändert werden und dazu führen, dass das Ergebnis nicht korrekt ist.

    • Symbol ist unveränderlich.

  2. String ist ein Objekt und benötigt daher eine Speicherzuordnung

    setzt "Abc" .object_id # 70322858612020

    setzt "Abc" .object_id # 70322846847380

    setzt "Abc" .object_id # 70322846815460

Auf der anderen Seite wird Symbol dasselbe Objekt verwenden:

puts :abc.object_id # 1147868

puts :abc.object_id # 1147868

puts :abc.object_id # 1147868

Daher benötigt der String mehr Zeit zum Verwenden und Vergleichen als das Symbol.

Sie können mehr hier lesen, um vollständig zu verstehen: 

1
Leo Le

symbol ist unveränderlich und String ist veränderbar.

wenn wir eine Operation an String ausführen, wird ein neues Objekt erstellt und Speicherplatz beansprucht. Da wir mehr und mehr Operationen mit Zeichenfolgen ausführen, verbrauchen wir immer mehr Speicher.

symbol ist ein Objekt, das unveränderlich ist. Wenn wir eine Operation ausführen, werden Änderungen am ursprünglichen Objekt vorgenommen. Es wird kein Objekt erstellt. Deshalb ist es rentabler.

für weitere Informationen können Sie hier klicken

0
user3423263

Symbole und Zeichenfolgen sind völlig verschieden dieser Beitrag hat einen kleinen Einblick in die Unterschiede. Wann und wo sie verwendet werden können, gibt es einen ziemlich ausführlichen Beitrag über hat viele: through .

0
Codebeef

Als Kontrapunkt schrieb kürzlich ein Freund einen Beitrag mit dem Titel "Ruby Rant" , der einen weiteren Blick auf Ruby-Symbole gibt.

0
Greg Hewgill