21 puntos por tsboard 2024-07-24 | 5 comentarios | Compartir por WhatsApp

Llevo aproximadamente 10 años usando Rust y realmente amo este lenguaje. Pero también hay varias cosas decepcionantes. A continuación, la lista.

1. El problema de Result<T, E>

Es excelente que el manejo de errores en Rust sea claro y obligatorio. Sin embargo, en el uso real resulta bastante incómodo.

  • Dificultades para quienes escriben librerías: el proceso de crear y convertir nuevos tipos de error es engorroso. En especial, cada vez que se agrega una dependencia, es muy molesto tener que añadir el tipo de error de cada función al tipo de error envoltorio.
  • La incomodidad en el código de aplicación: más que saber por qué falló una función, lo importante es propagar el error hacia arriba y mostrar el resultado al usuario. A diferencia de Java, Rust no ofrece un backtrace durante ese proceso de propagación, por lo que es difícil identificar la causa del problema.

2. La flexibilidad del sistema de módulos

El sistema de módulos de Rust es tan flexible que muchas veces termina siendo incómodo.

  • Flexibilidad excesiva: se pueden reexportar tipos o ajustar con mucho detalle los niveles de acceso, pero eso puede terminar exponiendo por error tipos que no se querían mostrar.
  • El problema de la regla de huérfanos: se recomienda dividir un proyecto en varios crates, pero la regla de huérfanos a veces se vuelve un obstáculo.

3. Tiempo de compilación y herramientas de IDE

El tiempo de compilación de Rust y la verificación de errores de las herramientas de IDE son demasiado lentos.

  • Tiempos de compilación largos: en proyectos grandes, si se modifica una sola función, se recompila el crate completo, lo que es muy ineficiente.
  • Respuesta lenta del IDE: Rust analyzer da la impresión de volver a indexar el proyecto cada vez que uno escribe, y esto es un problema especialmente en proyectos grandes.

Conclusión

Rust es mi lenguaje favorito, pero también existen estos puntos decepcionantes. Me pregunto si otras personas están pasando por los mismos problemas.

5 comentarios

 
ranolp 2024-07-28

En el manejo de errores, resulta práctico instalar y usar snafu/thiserror para las bibliotecas, y eyre/anyhow para las aplicaciones.

 
y15un 2024-07-26

La dificultad de quienes escriben librerías: [..snip..] Cada vez que agregas una dependencia, tener que añadir el tipo de error de cada función al tipo de error envoltorio es especialmente molesto.

Esta parte de verdad la siento hasta los huesos. No han sido una ni dos veces que he creado un enum de error exclusivo del crate y, cada vez que escribo un impl From<ExtError> for Error para los tipos de error que jalo desde las dependencias, pienso: "qué lata, esto es desesperantemente tedioso"...

 
eususu 2024-07-26

Quizás es porque todavía no he podido empezar bien, pero me gustaría sentir una decepción así.
Gracias por el buen artículo~

 
undercat 2024-07-25

¡Gracias por el buen artículo!

 
tsboard 2024-07-24

Agrego el siguiente comentario porque creo que puede ser útil sobre los tiempos largos de compilación: (by pr4wl)

Si rust-analyzer realiza una recompilación larga cada vez que haces un cambio, probablemente se deba a que las funciones o las variables de entorno que usa son distintas de las que utilizas al compilar la aplicación. De forma predeterminada, RA usa el mismo directorio de destino que cargo build para almacenar los artefactos de compilación, y si se realizan compilaciones incompatibles entre sí, seguirá haciendo compilaciones completas una y otra vez.

Este problema puede presentarse con frecuencia especialmente en Bevy, si usas la función bevy/dynamic_linking en la compilación pero no en rust-analyzer.

La solución más sencilla es indicarle a RA que use un directorio de destino diferente. Puedes consultar más detalles sobre esto en rust-analyzer.cargo.targetDir.

Otra solución es configurar todo para que todas las funciones y variables de entorno sean iguales, de modo que puedan reutilizar los artefactos de compilación entre sí. Sin embargo, esto puede ser complicado.