En términos de Java, los símbolos son cadenas internas. Esto significa, por ejemplo, que la comparación de igualdad de referencia ( eq
en Scala y ==
en Java) da el mismo resultado que la comparación de igualdad normal ( ==
en Scala y equals
en Java): 'abcd eq 'abcd
devolverá verdadero, aunque "abcd" eq "abcd"
podría no, dependiendo de los caprichos de JVM (bueno, debería para literales, pero no para cadenas creadas dinámicamente en general).
Otros lenguajes que usan símbolos son Lisp (que usa 'abcd
como Scala), Ruby ( :abcd
), Erlang y Prolog ( abcd
; se llaman átomos en lugar de símbolos).
Usaría un símbolo cuando no me importa la estructura de una cadena y lo usaría simplemente como un nombre para algo. Por ejemplo, si tengo una tabla de base de datos que representa CD, que incluye una columna llamada "precio", no me importa que el segundo carácter de "precio" sea "r", o sobre la concatenación de nombres de columna; por lo que una biblioteca de base de datos en Scala podría usar símbolos para los nombres de tablas y columnas.
Si tiene cadenas simples que representan los nombres de métodos en el código, que tal vez se transmitan, no está transmitiendo las cosas de manera adecuada. Esta es una especie de problema de límite de datos / código, no siempre es fácil trazar la línea, pero si dijéramos que en ese ejemplo esos nombres de métodos son más código que datos, entonces queremos algo que identifique claramente eso .
Un literal de símbolo entra en juego donde claramente diferencia cualquier dato de cadena antiguo con una construcción que se usa en el código. Realmente está allí donde desea indicar, no se trata solo de algunos datos de cadena, sino que de alguna manera es parte del código. La idea es que cosas como su IDE lo destacarían de manera diferente, y dadas las herramientas, podría refactorizarlas, en lugar de buscar / reemplazar texto.
Este enlace lo analiza bastante bien.
fuente
Python mantiene una tabla global interna de "cadenas internas" con los nombres de todas las variables, funciones, módulos, etc. Con esta tabla, el intérprete puede realizar búsquedas y optimizaciones más rápidas. Puede forzar este proceso con la
intern
función (sys.intern
en python3).Además, Java y Scala utilizan automáticamente "cadenas internas" para búsquedas más rápidas. Con scala, puede usar el
intern
método para forzar al interno de una cadena, pero este proceso no funciona con todas las cadenas. Los símbolos se benefician de que se garantice su internación, por lo que una única verificación de igualdad de referencia es suficiente para demostrar la igualdad o la desigualdad.fuente