2010-03-10 8 views
11

Cuando comencé a leer y aprender ruby, leo algo sobre el poder de los símbolos de rubí sobre las cadenas: los símbolos se almacenan en la memoria una sola vez, mientras que las cadenas se almacenan en la memoria una vez por cadena, incluso si son iguales.¿Por qué no hay más proyectos que utilicen símbolos de Ruby en lugar de cadenas?

Por ejemplo: Carriles params Hash en el controlador tiene un manojo de llaves como símbolos:

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

Pero otros proyectos de tamaño decente, como Sinatra y Jekyll no haga eso:

Jekyll :

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

Sinatra:

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

Esto hace que la lectura del código nuevo sea un poco complicada, y hace que sea difícil transferir el código y descubrir por qué no funciona el uso de símbolos. Hay muchos más ejemplos de esto y es un poco confuso. ¿Deberíamos o no deberíamos usar símbolos en este caso? ¿Cuáles son las ventajas de los símbolos y deberíamos usarlos aquí?

Respuesta

4

En ruby, después de crear AST, cada símbolo se representa como un entero único. Tener símbolos como teclas hash hace que la informática sea mucho más rápida, ya que la operación principal es la comparación.

+0

por lo que la razón de que estos proyectos no están poniendo en práctica esto debe ser porque no es de conocimiento común, que pueda No pienses en nada más. –

+1

teniendo en cuenta la velocidad del "resto" del código ruby, la optimización de sym es algo sin sentido, por lo que el caso no es falta de conocimiento, sino preferencia personal. rails lo usa más para la estética imho, más agradable escribir: x que "x" – clyfe

+5

lol, es más agradable. pero si algo está más optimizado, creo que deberíamos usarlo, especialmente si es más divertido escribirlo. –

4

Los símbolos no son basura recogidos AFAIK, por lo que podría ser una cosa a tener en cuenta, pero a excepción de eso, realmente son geniales como las teclas hash.

+1

Internamente, los símbolos de Ruby se almacenan como enteros, por lo que son tan grandes como los enteros en su plataforma. Además de eso, y también como literales enteros, son únicos (nunca hay dos objetos 1 o: foo), así que no me preocuparía demasiado por el GC. –

+0

[Los símbolos son basura recolectada desde Ruby 2.2] (https://bugs.ruby-lang.org/issues/9634) – Dennis

0

Una razón para el uso de cadenas puede ser el uso de yaml para definir los valores.

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}} 

Es posible utilizar yaml para definir teclas de símbolos:

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}} 

Pero en los símbolos yaml definición mirar un poco extraño, cuerdas parece más natural.

Otra razón para las cadenas como claves: Dependiendo del caso de uso, puede ser razonable ordenar por claves, pero no puede ordenar símbolos (al menos no sin una conversión a cadenas).

-1

La principal diferencia es que los símbolos múltiples que representan un único valor son idénticos, mientras que esto no es así con las cadenas. Por ejemplo:

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 referencias al símbolo: prueba, el mismo objeto.

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 referencias a la cadena "prueba", todos los objetos diferentes.

Esto significa que el uso de símbolos puede ahorrar un buen bit de memoria dependiendo de la aplicación. También es más rápido comparar símbolos para igualdad ya que son el mismo objeto, la comparación de cadenas idénticas es mucho más lenta ya que los valores de cadena deben ser comparados en lugar de solo los identificadores de objeto.

que suelen utilizar cuerdas para casi todo, excepto cosas como claves hash donde en realidad quiero un identificador único, no es una cadena

+0

¿Cómo responde esto la pregunta? No es "cuál es la diferencia entre cadenas y símbolos" o "dónde uso los símbolos" –

+0

Además, incluso en su respuesta, usted se contradice a sí mismo. Usted describe qué tan buenos son los símbolos, y luego dice que prefiere usar cadenas en todas partes. –

+0

sí, todavía digo que los símbolos son mejores para usar, pero depende del uso/requisitos que he mencionado en la última línea. –

Cuestiones relacionadas