2009-04-23 10 views
79

El uso de literales de símbolos no está inmediatamente claro por lo que he leído en Scala. ¿Alguien querría compartir algunos usos del mundo real?¿Cuáles son algunos ejemplos de casos de uso para literales de símbolos en Scala?

¿Hay algún idioma en particular de Java cubierto por literales de símbolos? ¿Qué idiomas tienen construcciones similares? Vengo de un fondo de Python y no estoy seguro de que haya algo análogo en ese idioma.

¿Qué me motivaría a utilizar 'HelloWorld vs' HelloWorld '?

Gracias

Respuesta

62

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, mientras que "abcd" eq "abcd" podría no, dependiendo de JVM caprichos (bueno, debería ser para literales, pero no para cadenas creadas dinámicamente en general).

Otros idiomas que utilizan símbolos son Lisp (que utiliza 'abcd como Scala), Ruby (:abcd), Erlang y Prolog (abcd; que se denominan átomos en lugar de símbolos).

Usaría un símbolo cuando no me importa la estructura de una cadena y la utilizo 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 en "precio" sea "r", o sobre concatenar nombres de columna; por lo que una biblioteca de base de datos en Scala podría razonablemente usar símbolos para nombres de tablas y columnas.

+22

Probablemente valga la pena recordar que == en Scala hace.es igual a una cosa, así que realmente la diferencia sería cuando se usa el método "eq" que hace referencia a la igualdad. Una ventaja, sin embargo, es que la comparación entre símbolos es extremadamente barata. – Calum

+0

@Calum, como lo es la comparación entre dos cadenas. Java interna (más o menos) todas las cadenas. –

+4

@Elazar: ¿Es eso realmente cierto? Tenía la impresión de que Java solo internaba literales (es decir, casi todas las cadenas en ejemplos triviales, y casi ninguna cadena en software de producción). Habiendo dicho que los casos de uso de símbolos suelen ser valores literales (dudo que a menudo los construyas desde cero), posiblemente la principal ventaja que obtienes es simplemente un tipo más descriptivo. – Calum

24

Si tiene cadenas de civil que representan a decir los nombres de métodos en el código, que tal vez van pasando alrededor, usted no está muy transportar cosas adecuadamente. Esta es una especie de límite de Datos/Códigos, no siempre es fácil dibujar la línea, pero si dijéramos que en ese ejemplo esos nombres de métodos tienen más código que datos, entonces queremos algo que identifique claramente esa .

Un Símbolo Literal entra en juego donde diferencia claramente cualquier dato antiguo de cadena con una construcción que se usa en el código. Es realmente allí donde desea indicar, esto no es solo una cadena de datos, pero de hecho de alguna manera parte del código. La idea de que cosas como tu IDE lo resalten de manera diferente, y con las herramientas, podrías refactorizarlas, en lugar de hacer búsqueda/reemplazo de texto.

Esto link lo analiza bastante bien.

+1

Esta es una v explicación útil. Me hace pensar en términos de alternativas a las enumeraciones, lo que puede ser torpe – javadba

1

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 función intern (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 método intern para forzar al interno de una cadena, pero este proceso no funciona con todas las cadenas. Los símbolos se benefician de la garantía de ser internados, por lo que una sola verificación de referencia de igualdad es suficiente para demostrar igualdad o desigualdad.

Cuestiones relacionadas