¿Cuáles son algunos ejemplos de casos de uso para símbolos literales en Scala?

93

El uso de símbolos literales no está claro de inmediato por lo que he leído en Scala. ¿A alguien le importaría compartir algunos usos del mundo real?

¿Existe un idioma de Java en particular cubierto por símbolos literales? ¿Qué lenguajes tienen construcciones similares? Vengo de un entorno de Python y no estoy seguro de que haya algo análogo en ese idioma.

¿Qué me motivaría a usar 'HelloWorld vs "HelloWorld"?

Gracias

Joe Holloway
fuente

Respuestas:

77

En términos de Java, los símbolos son cadenas internas. Esto significa, por ejemplo, que la comparación de igualdad de referencia ( eqen Scala y ==en Java) da el mismo resultado que la comparación de igualdad normal ( ==en Scala y equalsen Java): 'abcd eq 'abcddevolverá 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 'abcdcomo 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.

Alexey Romanov
fuente
25
Probablemente valga la pena recordar que == en Scala hace lo mismo .equals, por lo que realmente la diferencia sería cuando se usa el método "eq" que hace referencia a la igualdad. Sin embargo, una ventaja es que la comparación entre símbolos es extremadamente barata.
Calum
@Calum, como es la comparación entre dos cadenas. Pasantes de Java (más o menos) todas las cadenas.
Elazar Leibovich
4
@Elazar: ¿Es eso realmente cierto? Tenía la impresión de que Java solo incluía literales (es decir, casi todas las cadenas en ejemplos triviales y casi ninguna cadena en el software de producción). Habiendo dicho que los casos de uso de los símbolos suelen ser valores literales (dudo que a menudo los construyas desde cero), podría decirse que la principal ventaja que obtienes es simplemente un tipo más descriptivo.
Calum
1
@Elazar No lo son, porque los símbolos pueden confiar en que su valor sea interno, mientras que con Strings es opcional y puede optimizar algunos casos de uso. Los símbolos son más como enumeraciones creadas dinámicamente que cualquier otra cosa. Desarrollé esto en la respuesta que vinculé en mi última respuesta; por favor léalo para más información.
Calum
3
Entonces, "¡hola, mundo!" es una colección secuencial de personajes, mientras que 'helloWorld es un valor amigable para las personas en lugar de 14392.
CW Holeman II
26

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.

Saem
fuente
2
Esta es una explicación muy útil. Me hace pensar en términos de alternativas a las enumeraciones, que pueden ser torpes
javadba
2

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 internfunción ( sys.internen python3).

Además, Java y Scala utilizan automáticamente "cadenas internas" para búsquedas más rápidas. Con scala, puede usar el internmé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.

ChemaCortes
fuente