Estoy de acuerdo con Xuan, el uso de símbolos en Ruby proporciona una mejora en el rendimiento (la mayoría de las veces). Hay casos en los que el uso excesivo de símbolos puede provocar una pérdida real de memoria, lo cual no creo que quiera decir, pero no estoy seguro, así que abordaré eso primero:
Hablando de la pérdida de memoria:
Supongamos que tiene una fuente constante de información nueva, y cada registro está codificado por un nombre único. Luego, en su aplicación, lee dichos registros periódicamente y los coloca en un mapa de Hash con la clave de la versión del símbolo del nombre. Te das cuenta de que no puedes seguir haciendo esto para siempre, así que de vez en cuando caducas las entradas antiguas.
Si tiene un proceso Ruby ejecutando Rails que es muy longevo, entonces esto es un problema, incluso cuando expira las entradas del Mapa, los símbolos se quedarán en la memoria de tiempo de ejecución. Esto podría suceder, por ejemplo, si está ejecutando Rails en una aplicación independiente, o incluso a través de Phusion o algo con una configuración grande para el número máximo de solicitudes hasta el vencimiento.
- Cómo convertirse en un buen desarrollador de software teniendo en cuenta que soy un desarrollador web junior
- ¿Cuál es la mejor manera de explicar Process Algebra a un estudiante de CS?
- ¿Cuáles son algunos ejemplos de Node.js a escala?
- Si actualmente es ingeniero de software, ¿cuáles son las señales de que sería más adecuado para la gestión sobre el desarrollo, o viceversa?
- ¿Cuáles son las ventajas y desventajas de ser un consultor de software frente a un ingeniero de software recién salido de la universidad?
Otro ejemplo simple: un método ruby crea un millón de enteros aleatorios para algunos cálculos, y utiliza el formato de símbolo de esos enteros como claves hash. Incluso cuando el mapa hash obtiene basura recolectada, los símbolos no lo harán.
Así que sí, tenga cuidado de no usar en exceso instancias de símbolos.
Hablando de la fuga de abstracción:
1. Muchos idiomas tienen el mismo concepto (es decir, símbolos en Scala), para el mismo razonamiento de rendimiento.
2. Entonces, ¿qué pasa si el tipo es diferente? Ruby es dinámico y el tipo funciona bien con String, entonces, ¿cuál es el problema? En la mayoría de los casos, puede tratarlo como una cadena de todos modos, o realizar una llamada trivial to_s en él. El rendimiento puede diferir ligeramente, pero la funcionalidad es muy similar.
3. Depende de usted. Como dijo Miguel, este comportamiento no es involuntario o indeseable, y está bien documentado. Por lo tanto, no “con fugas”.
-Tom