2009-03-18 8 views

Antwort

7

Da Symbole fast immer über Literale erstellt werden, gibt es hier nicht viel Potenzial für eine Speicherexplosion. Ihr Verhalten wird durch ihre Verwendung ziemlich oft benötigt: Jedes Mal wenn Sie auf ein Symbol verweisen, ist es dasselbe.

Ebenso müssen Strings in Ruby eindeutig sein. Dies ist aufgrund der Art, wie sie verwendet werden - Textverarbeitung usw.

Entscheiden Sie, welche zu verwenden, abhängig von ihrer Semantik, nicht vorzeitig optimieren.

8

Wenn Sie auf das gleiche Symbol in der Schleife, dann ist es nicht das Objekt jedes Mal das heißt

while i < 10000 
    i += 1 
    :im_using_this_symbol_here 
end 

Jetzt neu erstellen müssen, wenn Sie eine Zeichenfolge verwenden, da stattdessen wird die Zeichenfolge 10K mal neu erstellt werden . Im Allgemeinen verwenden Sie Symbole in Fällen, in denen Sie das Literal fast wie eine Konstante oder einen Schlüssel behandeln. Ein sehr gutes Beispiel für mich wäre

link_to "News", :action => 'news' 

statt

link_to "News", "action" => 'news' 

Aktion sein wiederverwendet werden immer und immer wieder in Ihrer Anwendung.

+11

Ich kann eine Faustregel hinzufügen: nie, nie, konvertieren Sie alle benutzerdefinierten Zeichenfolgen zu Symbolen. Das würde die Möglichkeit eines DOS-Angriffs eröffnen. – Arsen7

6

Wenn Sie Ruby 2.2.0 oder höher verwenden, sollte es in der Regel OK sein, viele Symbole dynamisch zu erstellen, da sie gemäß Ruby 2.2.0-preview1 announcement, der eine Verknüpfung zu more details about the new symbol GC hat, Müll gesammelt werden. Wenn Sie jedoch Ihre dynamischen Symbole an eine Art Code übergeben, der sie in eine ID konvertiert (ein internes Ruby-Implementierungskonzept, das im C-Quellcode verwendet wird), wird es in diesem Fall gepinnt und es wird niemals Müll gesammelt. Ich bin mir nicht sicher, wie häufig das passiert.

Bei der Entscheidung Symbole oder Zeichenketten verwenden, sollten Sie Folgendes berücksichtigen:

  • Symbole nicht geändert werden können, nachdem sie erstellt werden.
  • Symbole haben nicht viele der Methoden, die Strings haben, wie
  • Symbole können sehr effizient für Gleichheit miteinander verglichen werden.
  • Symbole sollen den Namen von etwas nach der Symbol docs darstellen. Ich würde sie nicht verwenden, um irgendetwas zu speichern, das nicht als Name angesehen werden kann.
Verwandte Themen