2010-03-10 10 views
11

Als ich anfing, über Ruby zu lesen und zu lernen, las ich etwas über die Kraft von Ruby-Symbolen über Strings: Symbole werden nur einmal im Speicher gespeichert, während Strings einmal pro String im Speicher gespeichert werden, auch wenn sie gleich sind.Warum verwenden nicht mehr Projekte Ruby-Symbole anstelle von Strings?

Zum Beispiel: Rails' params Hash im Controller hat eine Reihe von Tasten als Symbole:

params[:id] or 
params[:title]... 

Aber auch andere anständig große Projekte wie Sinatra und Jekyll tun das nicht:

Jekyll :

post.data["title"] or 
post.data["tags"]... 

Sinatra:

params["id"] or 
params["title"]... 

Dies macht das Lesen neuer Code ein wenig schwierig, und macht es schwierig, Code herum zu übertragen und herauszufinden, warum die Verwendung von Symbolen nicht funktioniert. Es gibt viele weitere Beispiele dafür und es ist etwas verwirrend. Sollten wir oder sollten wir nicht Symbole in diesem Fall verwenden? Was sind die Vorteile von Symbolen und sollten wir sie hier verwenden?

Antwort

4

In Ruby wird nach dem Erstellen der AST jedes Symbol als eine eindeutige ganze Zahl dargestellt. Die Verwendung von Symbolen als Hash-Schlüssel macht die Berechnung viel schneller, da die Hauptoperation der Vergleich ist.

+0

so der Grund, diese Projekte nicht umsetzen dies sein muss, weil es nicht allgemein bekannt ist, kann ich Denke an etwas anderes. –

+1

unter Berücksichtigung der Geschwindigkeit des "Rest" von Ruby-Code, ist die sym-Optimierung sinnlos, so ist der Fall nicht Mangel an Wissen, sondern eher persönliche Präferenz. Schienen verwendet es mehr für die Ästhetik imho, netter zu schreiben: x als "x" – clyfe

+5

lol, es ist netter. aber wenn etwas mehr optimiert ist, sollten wir es verwenden, vor allem, wenn es mehr Spaß macht zu schreiben. –

4

Symbole sind nicht Garbage Collection AFAIK, so dass eine Sache, auf die Sie achten sollten, aber abgesehen davon, dass sie wirklich gut als Hash-Schlüssel sind.

+1

Intern Ruby-Symbole werden als Ganzzahlen gespeichert. Sie sind also so groß wie ganze Zahlen auf Ihrer Plattform. Abgesehen davon - und auch wie Integer-Literale - sind sie einzigartig (es gibt nie zwei 1 oder: foo-Objekte), also würde ich mich nicht zu sehr um GC kümmern. –

+0

[Symbole sind Müll gesammelt seit Ruby 2.2] (https://bugs.ruby-lang.org/issues/9634) – Dennis

0

Ein Grund für die Verwendung von Zeichenfolgen kann die Verwendung von Yaml sein, um die Werte zu definieren.

require 'yaml' 
data = YAML.load(<<-data 
    one: 
     title: one 
     tag: 1 
    two: 
     title: two 
     tag: 2 
    data 
) #-> {"one"=>{"title"=>"one", "tag"=>1}, "two"=>{"title"=>"two", "tag"=>2}} 

können Sie verwenden yaml Symbol-Tasten zu definieren:

require 'yaml' 
data = YAML.load(<<-data 
    :one: 
     :title: one 
     :tag: 1 
    :two: 
     :title: two 
     :tag: 2 
    data 
) #-> {:one=>{:title=>"one", :tag=>1}, :two=>{:title=>"two", :tag=>2}} 

Aber in den yaml-Definition-Symbole sehen ein bisschen seltsam, sieht Saiten natürlicher.

Ein weiterer Grund für Strings als Schlüssel: Je nach Anwendungsfall kann es sinnvoll sein, nach Schlüsseln zu sortieren, aber Symbole können nicht sortiert werden (zumindest nicht ohne Umwandlung in Strings).

-1

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.

Normalerweise verwende ich Saiten für fast alles außer Dinge wie Hash-Schlüssel, wo ich wirklich eine eindeutige Kennung wollen, kein String

+0

Wie beantwortet das die Frage? Es ist nicht "was ist der Unterschied zwischen Strings und Symbolen" oder "Wo verwende ich Symbole?" –

+0

Auch Sie selbst widersprechen sich selbst in Ihrer Antwort. Sie beschreiben, wie groß die Symbole sind, und sagen dann, dass Sie es vorziehen, Strings überall zu verwenden. –

+0

Ja, ich sage immer noch, dass Symbole besser zu benutzen sind, aber es hängt von den Anwendungen/Anforderungen ab, die ich in der letzten Zeile erwähnt habe. –

Verwandte Themen