Skip to content

Commit 0f13144

Browse files
committed
feat: add cargo modules
1 parent 4172908 commit 0f13144

File tree

1 file changed

+257
-0
lines changed

1 file changed

+257
-0
lines changed

content/4.cargo/2.modules.md

Lines changed: 257 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,257 @@
1+
---
2+
title: 'Cargo'
3+
description: ''
4+
draft: true
5+
data:
6+
type: 'custom'
7+
topicLevel: 'start'
8+
position:
9+
x: 200
10+
y: 750
11+
sourcePosition:
12+
error-handling: 'right'
13+
targetPosition:
14+
traits: 'bottom'
15+
---
16+
# Organizando Proyectos en Rust: Módulos y Visibilidad
17+
18+
Cuando desarrollamos en Rust, mantener el código organizado es esencial para la escalabilidad y la mantenibilidad. Rust ofrece un sistema de módulos flexible que nos ayuda a dividir el código en componentes más manejables. En este artículo exploraremos cómo crear y gestionar módulos, controlar su visibilidad, y estructurar proyectos de manera eficiente, abordando las prácticas más recomendadas en la comunidad.
19+
20+
---
21+
22+
## Introducción a los módulos
23+
24+
Los módulos en Rust agrupan código relacionado bajo un espacio de nombres, permitiendo:
25+
26+
- **Organización lógica:** Divide el código en archivos o directorios.
27+
- **Encapsulación:** Restringe qué partes del código son accesibles externamente.
28+
- **Reutilización:** Facilita la modularidad y el uso compartido de código.
29+
30+
Un módulo puede contener funciones, estructuras, enumeraciones, constantes e incluso otros módulos.
31+
32+
---
33+
34+
## Crear y gestionar módulos
35+
36+
### Módulos en el mismo archivo
37+
La forma más sencilla de declarar un módulo es hacerlo directamente en el archivo:
38+
39+
```rust
40+
mod math {
41+
pub fn add(a: i32, b: i32) -> i32 {
42+
a + b
43+
}
44+
}
45+
```
46+
47+
Luego accedes a los elementos públicos con el prefijo del módulo:
48+
```rust
49+
fn main() {
50+
let sum = math::add(2, 3);
51+
println!("Suma: {}", sum);
52+
}
53+
```
54+
55+
### Módulos en archivos separados
56+
Para mantener el código limpio, puedes mover los módulos a archivos independientes:
57+
58+
En `main.rs`:
59+
```rust
60+
mod math;
61+
62+
fn main() {
63+
let sum = math::add(5, 7);
64+
println!("Suma: {}", sum);
65+
}
66+
```
67+
68+
En `math.rs`:
69+
```rust
70+
pub fn add(a: i32, b: i32) -> i32 {
71+
a + b
72+
}
73+
```
74+
75+
### Módulos como directorios
76+
Si un módulo incluye submódulos, puedes organizarlo en un directorio con un archivo `mod.rs` o estructurarlo usando archivos con el mismo nombre que los submódulos.
77+
78+
Estructura de ejemplo:
79+
```
80+
src/
81+
├── main.rs
82+
├── math/
83+
│ ├── mod.rs
84+
│ ├── add.rs
85+
│ └── multiply.rs
86+
```
87+
88+
En `math/mod.rs`:
89+
```rust
90+
pub mod add;
91+
pub mod multiply;
92+
```
93+
94+
---
95+
96+
## Control de visibilidad
97+
98+
Por defecto, los módulos y sus elementos son privados. Para hacerlos accesibles, usa `pub`.
99+
100+
```rust
101+
mod shapes {
102+
pub struct Rectangle {
103+
pub width: u32,
104+
pub height: u32,
105+
}
106+
107+
impl Rectangle {
108+
pub fn area(&self) -> u32 {
109+
self.width * self.height
110+
}
111+
}
112+
}
113+
```
114+
115+
El acceso desde otro módulo o función será así:
116+
```rust
117+
fn main() {
118+
let rect = shapes::Rectangle { width: 10, height: 20 };
119+
println!("Área: {}", rect.area());
120+
}
121+
```
122+
123+
---
124+
125+
## Estructuración recomendada para proyectos Rust
126+
127+
La organización de un proyecto depende de su propósito. Aquí hay patrones comunes:
128+
129+
### 1. **Proyectos ejecutables simples**
130+
Los proyectos pequeños suelen tener un único archivo `main.rs`:
131+
132+
```
133+
src/
134+
└── main.rs
135+
```
136+
137+
### 2. **Proyectos ejecutables grandes**
138+
A medida que crece, puedes mover lógica a módulos:
139+
140+
```
141+
src/
142+
├── main.rs
143+
├── config.rs
144+
├── handlers.rs
145+
└── utils.rs
146+
```
147+
148+
En `main.rs`:
149+
```rust
150+
mod config;
151+
mod handlers;
152+
mod utils;
153+
```
154+
155+
### 3. **Bibliotecas**
156+
Las bibliotecas usan un archivo `lib.rs` para exponer su API pública:
157+
158+
```
159+
src/
160+
├── lib.rs
161+
└── utils.rs
162+
```
163+
164+
En `lib.rs`:
165+
```rust
166+
pub mod utils;
167+
```
168+
169+
### 4. **Híbridos (ejecutable + biblioteca)**
170+
Un proyecto puede tener `main.rs` para la aplicación y `lib.rs` para lógica reutilizable:
171+
172+
```
173+
src/
174+
├── lib.rs
175+
└── main.rs
176+
```
177+
178+
En `main.rs`:
179+
```rust
180+
use mycrate::utils::some_function;
181+
182+
fn main() {
183+
some_function();
184+
}
185+
```
186+
187+
En `lib.rs`:
188+
```rust
189+
pub mod utils {
190+
pub fn some_function() {
191+
println!("Función compartida");
192+
}
193+
}
194+
```
195+
196+
### 5. **Proyectos con múltiples binarios**
197+
Usa un directorio `src/bin/` para incluir otros ejecutables:
198+
199+
```
200+
src/
201+
├── main.rs
202+
├── lib.rs
203+
└── bin/
204+
├── tool1.rs
205+
└── tool2.rs
206+
```
207+
208+
---
209+
210+
## Puntos de entrada: `main.rs` y `lib.rs`
211+
212+
### `main.rs`
213+
Es el punto de entrada de los ejecutables. Aquí defines la lógica inicial de tu programa.
214+
215+
### `lib.rs`
216+
Sirve como punto de entrada para bibliotecas. Aquí defines qué módulos y funciones serán públicos para los usuarios de la biblioteca.
217+
218+
### Coexistencia de `main.rs` y `lib.rs`
219+
En proyectos híbridos, `lib.rs` puede contener la lógica principal reutilizable y `main.rs` consumirla:
220+
221+
En `lib.rs`:
222+
```rust
223+
pub fn greet(name: &str) {
224+
println!("Hola, {}!", name);
225+
}
226+
```
227+
228+
En `main.rs`:
229+
```rust
230+
use mycrate::greet;
231+
232+
fn main() {
233+
greet("Mundo");
234+
}
235+
```
236+
237+
---
238+
239+
## Buenas prácticas y convenciones
240+
241+
1. **Divide y vencerás:** Usa módulos para separar responsabilidades.
242+
2. **Restricción de visibilidad:** Haz públicos solo los elementos necesarios.
243+
3. **Nombres consistentes:** Usa nombres descriptivos para módulos y archivos.
244+
4. **Centraliza lo común:** Mueve funciones reutilizables a `lib.rs`.
245+
246+
---
247+
248+
## Configuraciones adicionales para módulos
249+
250+
- **Agrupación lógica:** Usa directorios para módulos con múltiples submódulos.
251+
- **Macros compartidas:** Crea un módulo separado para macros reutilizables, por ejemplo, `src/macros.rs`.
252+
253+
---
254+
255+
## Conclusión
256+
257+
Organizar proyectos con módulos en Rust no solo mejora la claridad del código, sino que también facilita su escalabilidad. Ya sea que trabajes en un ejecutable, una biblioteca o ambos, seguir estas prácticas te ayudará a mantener un código limpio, reutilizable y fácil de entender. ¡Experimenta con estas técnicas y lleva tus proyectos al siguiente nivel! 🚀

0 commit comments

Comments
 (0)