Cuando un archivo ya es demasiado pequeño
\n\nEstás escribiendo en Rust. Tu proyecto crece. Ayer main.rs lo contenía todo: funciones, estructuras, un par de configuraciones. Y hoy pierdes cinco minutos buscando la función que necesitas entre miles de líneas. ¿Te suena familiar?
Tarde o temprano, todo desarrollador de Rust se enfrenta a la necesidad de dividir el código en partes lógicas. Parecería que no podría ser más sencillo: creas una carpeta, colocas los archivos, importas y listo. Pero el sistema de módulos de Rust es famoso por su rigurosidad. Una entrada incorrecta en mod.rs y el compilador arroja un error que te tomará media hora descifrar.
En este artículo, analizaremos los principales errores al dividir un módulo de Rust en varios archivos y, lo más importante, mostraremos cómo evitarlos. Aprenderá a organizar correctamente la estructura de archivos, cuándo usar mod.rs y cuándo lib.rs, y por qué pub use es su mejor amigo.
Anatomía del sistema de módulos de Rust
\n\nAntes de sumergirnos en los errores, recordemos los conceptos básicos. En Rust, un módulo es una unidad de organización del código. Por defecto, cada archivo es un módulo, pero no todo es tan lineal.
\n\nHay dos enfoques:
\n\n- \n
- Archivo-módulo homónimo: el archivo
utils.rsse convierte automáticamente en el móduloutilssi declarasmod utils;enlib.rsomain.rs. \n - Directorio-módulo: una carpeta
utils/con un archivomod.rsdentro. En este caso,mod.rses el punto de entrada al módulo. \n
Suena simple, pero aquí es donde se esconden la mayoría de las trampas. Analicemos las más comunes.
\n\nTop 5 errores al dividir un módulo en varios archivos
\n\nError n.º 1: Olvidaste declarar el submódulo
\n\nCreaste el archivo network/tcp.rs e intentas usarlo. Escribes use network::tcp; y obtienes un error de compilación. ¿Por qué? Porque Rust no escanea las carpetas automáticamente. Debes declarar explícitamente cada submódulo.
// network/mod.rs\n// ❌ Error: el submódulo tcp no está declarado\n// use network::tcp; // no compilará\n\n// ✅ Correcto:\npub mod tcp; // declaramos el submódulo\n\n\nCómo evitarlo: Siempre verifica que hayas agregado pub mod nombre_del_submódulo; en el módulo padre. Es similar a una importación explícita: Rust exige claridad.
Error n.º 2: Confusión entre mod.rs y lib.rs
\n\nLos principiantes suelen colocar mod.rs en la raíz del proyecto, junto a main.rs. Esto funciona, pero solo si estás creando una biblioteca. Para un archivo ejecutable (main.rs), el módulo raíz es el propio main.rs. Y mod.rs es un archivo dentro de una carpeta.
my_project/\n├── main.rs // módulo raíz para el binario\n├── lib.rs // módulo raíz para la biblioteca (si existe)\n├── utils/\n│ ├── mod.rs // punto de entrada al módulo utils\n│ └── helpers.rs\n\n\nCómo evitarlo: Recuerda la regla: mod.rs solo vive dentro de una carpeta-módulo. Si necesitas un módulo raíz para la biblioteca, usa lib.rs.
Error n.º 3: Olvidaste el pub en los submódulos
\n\nDeclaraste el submódulo, pero aún así no puedes llamar a la función. Lo más probable es que hayas olvidado especificar pub.
// network/mod.rs\npub mod tcp;\n\n// network/tcp.rs\n// ❌ La función es privada por defecto\nfn connect() { /* ... */ }\n\n// ✅ La hacemos pública\npub fn connect() { /* ... */ }\n\n\nEn Rust, todo es privado por defecto. Esto no es un error, sino una característica: tú decides qué exponer al mundo exterior. Si la función se necesita fuera del módulo, coloca pub.
Cómo evitarlo: Usa pub de forma consciente. Para utilidades internas, deja el acceso privado. Para API, hazlo público.