que - hash.map ruby
¿Cuál es la diferencia entre una cadena y un símbolo en Ruby? (10)
¿Cuáles son las diferencias entre Symbols & Strings?
- Los símbolos son inmutables: su valor permanece constante.
- Los usos múltiples del mismo símbolo tienen el mismo ID de objeto y son el mismo objeto en comparación con la cadena, que será un objeto diferente con ID de objeto único, siempre.
- No puede llamar a ninguno de los métodos String como #upcase, #split on Symbols.
De entender las diferencias entre símbolos y cadenas en Ruby
Si eres chino, también puedes leer 理解 Ruby Symbol
¿Cuál es la diferencia entre una cadena y un símbolo en Ruby y cuándo deberías usar uno sobre el otro?
Como contrapunto, un amigo mío escribió recientemente una publicación titulada "Ruby Rant" que da otra mirada a los símbolos de Ruby.
Hay dos diferencias principales entre cadena y símbolo en Ruby.
La cadena es mutable y el símbolo no es
Debido a que la cadena es mutable, se puede cambiar en alguna parte y puede dar lugar a que el resultado no sea correcto.
El símbolo es inmutable.
String es un Objeto por lo que necesita asignación de memoria
pone "abc" .object_id # 70322858612020
pone "abc" .object_id # 70322846847380
pone "abc" .object_id # 70322846815460
Por otro lado, Symbol tendrá el mismo objeto:
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
Por lo tanto, el String tomará más tiempo para usarlo y compararlo que Symbol.
Puede leer más aquí para comprender completamente:
La declaración
foo = "bar"
crea un nuevo objeto en la memoria. Si repetimos la declaración
foo = "bar"
Creamos otro objeto
para obtenerlo más claramente, prueba el siguiente código en la consola ruby
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
obtendrás resultados como
string bar with object id = 70358547221180
string bar with object id = 70358548927060
que muestra claramente que hay dos objetos diferentes para la misma cadena. Ahora, si usas un símbolo, creará un objeto por cada símbolo
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
muestra
symbol bar with object id = 7523228
symbol bar with object id = 7523228
lo que significa que solo hay un objeto para: bar
otros Símbolos son inmutables y no puedes llamar a ninguno de los métodos de Cadena como #upcase, #split
on Symbols.
La comparación de símbolos es más rápida que la comparación de cadenas.
Los símbolos se pueden considerar como cadenas constantes / inmutables que forman un conjunto único que se convierte efectivamente en punteros de memoria en el montón. Esto significa que comparar dos símbolos es rápido porque solo está comparando 2 enteros (punteros de memoria).
Las cadenas son mutables, por lo que el puntero de memoria a su valor en el montón puede cambiar después de la modificación. Esto significa que las operaciones de comparación son más lentas porque pueden existir duplicados que son semánticamente equivalentes.
Usos
use Symbol
cuando esté seguro de que el valor permanecerá constante. Ejemplo: use símbolos para las teclas hash, use una cadena cuando quiera cambiar el valor o quiera usar el método de cadena en él.
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, todo 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 diferentes objetos.
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 compararse en lugar de solo los identificadores de objeto.
En cuanto a cuándo usarlo, suelo usar cadenas para casi todo, excepto cosas como claves hash, en las que realmente quiero un identificador único, no una cadena.
Las cadenas son mutables, símbolos arre inmutables
Nota: Los objetos mutables se pueden cambiar después de la asignación, mientras que los objetos inmutables solo se pueden sobrescribir http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/
Los símbolos y las cadenas son completamente diferentes; esta publicación tiene una pequeña idea de las diferencias. En cuanto a cuándo y dónde usarlos, hay una publicación bastante extensa sobre este tema que tiene muchas: a través de .
Un símbolo es algo que usa para representar nombres y cadenas. Es posible que desee utilizar un símbolo cuando necesite usar una cadena varias veces, ya que es mucho más fácil y productivo.
Y acabo de encontrar esto a través de google, que puede ofrecer más detalles: aquí tienes
Una diferencia adicional entre String
y Symbol
es que una String
tiene muchos más métodos para la manipulación de cadenas, mientras que un Symbol
es un objeto relativamente delgado.
Consulte la documentación de la clase String
y la clase Symbol
.
el símbolo es inmutable y la cadena es mutable.
cuando realizamos cualquier operación en una cadena, entonces crea un nuevo objeto y toma el memery. A medida que hemos realizado más y más operaciones en cadena, estamos consumiendo más y más memoria.
el símbolo es un objeto que es inmutable significa que si realizamos cualquier operación, entonces realiza cambios en el objeto original, no creará ningún objeto, por eso es más rentable.
para más información, puede hacer clic aquí