2009-03-18 8 views

Respuesta

7

Como los símbolos casi siempre se crean a través de literales, aquí no hay mucho potencial para una explosión de memoria. Su comportamiento es muy requerido por su uso: cada vez que te refieres a un símbolo, es el mismo.

Del mismo modo, las cadenas deben ser únicas en Ruby. Esto se debe a la forma en que se usan: procesamiento de texto, etc.

Decida cuál usar según su semántica, no optimice prematuramente.

8

Si se hace referencia a un mismo símbolo en su bucle, entonces no tiene que volver a crear ese objeto cada vez es decir

while i < 10000 
    i += 1 
    :im_using_this_symbol_here 
end 

Ahora bien, si utiliza una cadena allí en vez, la cadena será recreado 10K veces . En general, use símbolos en casos en los que casi trate el literal como una constante o una clave. Un ejemplo muy bueno para mí sería

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

en lugar de

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

acción de volver a ser utilizado una y otra vez dentro de la aplicación.

+11

Puedo agregar una regla de oro: nunca, nunca, convertir las cadenas proporcionadas por el usuario a Símbolos. Eso abriría la posibilidad de un ataque DOS. – Arsen7

6

Si está utilizando Ruby 2.2.0 o posterior, generalmente debería estar bien crear dinámicamente una gran cantidad de símbolos, ya que serán basura recolectada según el Ruby 2.2.0-preview1 announcement, que tiene un enlace a more details about the new symbol GC. Sin embargo, si pasa sus símbolos dinámicos a algún tipo de código que lo convierta en una ID (un concepto interno de implementación de Ruby utilizado en el código fuente C), en ese caso se fijará y nunca se recolectará la basura. No estoy seguro de qué tan comúnmente eso sucede.

la hora de decidir si se debe utilizar símbolos o cuerdas que debe considerar:

  • Los símbolos no se pueden cambiar después de su creación.
  • Los símbolos no tienen muchos de los métodos que tienen las cadenas, como
  • Los símbolos se pueden comparar de manera muy eficiente entre sí para garantizar la igualdad.
  • Se supone que los símbolos representan el nombre de algo de acuerdo con Symbol docs. No los usaría para almacenar nada que no se pueda considerar un nombre.
Cuestiones relacionadas