Skip to content

Commit e8d905e

Browse files
committed
fix(content:traits): move topics
1 parent fd61fd7 commit e8d905e

File tree

5 files changed

+295
-115
lines changed

5 files changed

+295
-115
lines changed

content/5.traits/definition.md renamed to content/5.traits/1.definition.md

+37-38
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
11
---
2-
title: 'Definiendo un Trait'
3-
description: 'Definiendo Traits en Rust: La Base de la Abstracción y el Comportamiento'
2+
title: "Definiendo un Trait"
3+
description: "Definiendo Traits en Rust: La Base de la Abstracción y el Comportamiento"
44
draft: true
55
data:
6-
type: 'custom'
7-
topicLevel: 'start'
6+
type: "custom"
7+
topicLevel: "start"
88
position:
9-
x: 200
9+
x: 400
1010
y: 900
1111
sourcePosition:
12-
cargo: 'top'
13-
targetPosition:
14-
smart-pointers: 'bottom'
12+
traits: "left"
1513
---
14+
1615
# Definiendo Traits en Rust: La Base de la Abstracción y el Comportamiento
1716

18-
En el artículo anterior, exploramos qué son los traits en Rust a nivel conceptual. Ahora vamos un paso más allá y nos enfocamos en **cómo definir y usar traits**. Veremos cómo incluir tipos y constantes dentro de ellos, cómo permitir que los traits se autoimplementen para ciertos tipos, y cómo separar lógicas en traits para lograr un diseño más modular.
17+
En el artículo anterior, exploramos qué son los traits en Rust a nivel conceptual. Ahora vamos un paso más allá y nos enfocamos en **cómo definir y usar traits**. Veremos cómo incluir tipos y constantes dentro de ellos, cómo permitir que los traits se autoimplementen para ciertos tipos, y cómo separar lógicas en traits para lograr un diseño más modular.
1918

20-
## ¿Qué es un trait y cómo se define?
19+
## ¿Qué es un trait y cómo se define?
2120

22-
Un **trait** en Rust se define utilizando la palabra clave `trait`. Dentro del trait, declaramos métodos que los tipos que lo implementen deben cumplir.
21+
Un **trait** en Rust se define utilizando la palabra clave `trait`. Dentro del trait, declaramos métodos que los tipos que lo implementen deben cumplir.
2322

24-
### Ejemplo básico
23+
### Ejemplo básico
2524

2625
```rust
2726
trait Greeting {
@@ -42,9 +41,9 @@ let user = Person { name: "Alice".to_string() };
4241
user.say_hello(); // Output: Hello, my name is Alice
4342
```
4443

45-
## Métodos con implementación por defecto
44+
## Métodos con implementación por defecto
4645

47-
Rust permite definir métodos con una implementación predeterminada en un trait. Esto significa que cualquier tipo que implemente el trait puede optar por usar la implementación predeterminada o proporcionar la suya propia.
46+
Rust permite definir métodos con una implementación predeterminada en un trait. Esto significa que cualquier tipo que implemente el trait puede optar por usar la implementación predeterminada o proporcionar la suya propia.
4847

4948
```rust
5049
trait Greeting {
@@ -61,11 +60,11 @@ let bot = Robot;
6160
bot.say_hello(); // Output: Hello!
6261
```
6362

64-
Esto es útil para reducir duplicación de código y proporcionar un comportamiento genérico.
63+
Esto es útil para reducir duplicación de código y proporcionar un comportamiento genérico.
6564

66-
## Constantes en los traits
65+
## Constantes en los traits
6766

68-
Los traits también pueden contener constantes. Estas constantes deben ser definidas en las implementaciones del trait.
67+
Los traits también pueden contener constantes. Estas constantes deben ser definidas en las implementaciones del trait.
6968

7069
```rust
7170
trait Configurable {
@@ -86,9 +85,9 @@ let net = Network;
8685
println!("Max retries: {}", net.retries_allowed()); // Output: Max retries: 3
8786
```
8887

89-
## Tipos asociados en los traits
88+
## Tipos asociados en los traits
9089

91-
Los traits pueden definir **tipos asociados**. Esto permite que los tipos que implementen el trait especifiquen un tipo concreto para ese asociado.
90+
Los traits pueden definir **tipos asociados**. Esto permite que los tipos que implementen el trait especifiquen un tipo concreto para ese asociado.
9291

9392
```rust
9493
trait Container {
@@ -119,13 +118,13 @@ bag.add(4);
119118
println!("{:?}", bag.remove()); // Output: Some(4)
120119
```
121120

122-
Los tipos asociados hacen que el diseño sea más flexible y expresivo, especialmente cuando trabajamos con genéricos.
121+
Los tipos asociados hacen que el diseño sea más flexible y expresivo, especialmente cuando trabajamos con genéricos.
123122

124-
## Autoimplementación de traits
123+
## Autoimplementación de traits
125124

126-
Podemos crear traits que se implementen automáticamente para ciertos tipos o bajo condiciones específicas. Esto se conoce como **implementación en bloque blanket**.
125+
Podemos crear traits que se implementen automáticamente para ciertos tipos o bajo condiciones específicas. Esto se conoce como **implementación en bloque blanket**.
127126

128-
### Ejemplo: Implementación para todos los tipos que cumplen un trait
127+
### Ejemplo: Implementación para todos los tipos que cumplen un trait
129128

130129
```rust
131130
trait Printable {
@@ -142,13 +141,13 @@ impl<T: std::fmt::Display> Printable for T {
142141
"Hello, Rust!".print(); // Output: Hello, Rust!
143142
```
144143

145-
Aquí, cualquier tipo que implemente `Display` también implementará automáticamente `Printable`.
144+
Aquí, cualquier tipo que implemente `Display` también implementará automáticamente `Printable`.
146145

147-
## Separando lógicas con traits
146+
## Separando lógicas con traits
148147

149-
Los traits nos permiten dividir la lógica de un programa en unidades pequeñas y reutilizables. Esto es especialmente útil en programas complejos.
148+
Los traits nos permiten dividir la lógica de un programa en unidades pequeñas y reutilizables. Esto es especialmente útil en programas complejos.
150149

151-
### Ejemplo: Modularidad con múltiples traits
150+
### Ejemplo: Modularidad con múltiples traits
152151

153152
```rust
154153
trait Flyable {
@@ -178,11 +177,11 @@ sparrow.fly(); // Output: I can fly!
178177
goldfish.swim(); // Output: I can swim!
179178
```
180179

181-
Al separar los comportamientos en traits, puedes combinarlos fácilmente según sea necesario.
180+
Al separar los comportamientos en traits, puedes combinarlos fácilmente según sea necesario.
182181

183-
## Implementaciones condicionales
182+
## Implementaciones condicionales
184183

185-
Los traits pueden implementarse bajo ciertas condiciones utilizando el sistema de bounds genéricos de Rust.
184+
Los traits pueden implementarse bajo ciertas condiciones utilizando el sistema de bounds genéricos de Rust.
186185

187186
```rust
188187
trait Summable {
@@ -202,17 +201,17 @@ let numbers: Vec<i32> = vec![1, 2, 3];
202201
println!("Sum: {}", numbers.sum()); // Output: Sum: 6
203202
```
204203

205-
Esta implementación solo es válida si los elementos del `Vec` cumplen con las condiciones establecidas.
204+
Esta implementación solo es válida si los elementos del `Vec` cumplen con las condiciones establecidas.
206205

207-
## Ventajas del diseño con traits
206+
## Ventajas del diseño con traits
208207

209-
1. **Modularidad**: Los traits permiten dividir grandes problemas en piezas pequeñas y manejables.
210-
2. **Reutilización de código**: Implementar comportamientos comunes en múltiples tipos.
211-
3. **Abstracción poderosa**: Combinados con genéricos, los traits eliminan la necesidad de duplicar código para diferentes tipos.
212-
4. **Extensibilidad**: Puedes añadir comportamientos a tipos existentes sin modificar su definición original.
208+
1. **Modularidad**: Los traits permiten dividir grandes problemas en piezas pequeñas y manejables.
209+
2. **Reutilización de código**: Implementar comportamientos comunes en múltiples tipos.
210+
3. **Abstracción poderosa**: Combinados con genéricos, los traits eliminan la necesidad de duplicar código para diferentes tipos.
211+
4. **Extensibilidad**: Puedes añadir comportamientos a tipos existentes sin modificar su definición original.
213212

214-
## Conclusión
213+
## Conclusión
215214

216-
Los traits en Rust son una herramienta increíblemente poderosa para modelar comportamientos, separar lógicas y extender la funcionalidad de los tipos. Desde métodos con implementación por defecto hasta constantes y tipos asociados, los traits ofrecen flexibilidad para diseñar sistemas robustos y reutilizables.
215+
Los traits en Rust son una herramienta increíblemente poderosa para modelar comportamientos, separar lógicas y extender la funcionalidad de los tipos. Desde métodos con implementación por defecto hasta constantes y tipos asociados, los traits ofrecen flexibilidad para diseñar sistemas robustos y reutilizables.
217216

218217
Al comprender cómo funcionan y cómo podemos aprovecharlos para estructurar programas de manera más eficiente, estaremos mejor equipados para aprovechar todo el potencial que Rust tiene para ofrecer. 🚀

content/5.traits/autotraits.md renamed to content/5.traits/2.autotraits.md

+21-24
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
---
2-
title: 'Autotraits'
3-
description: 'Explorando los Auto Traits y Autoimplementaciones en Rust'
2+
title: "Autotraits"
3+
description: "Explorando los Auto Traits y Autoimplementaciones en Rust"
44
draft: true
55
data:
6-
type: 'custom'
7-
topicLevel: 'start'
6+
type: "custom"
7+
topicLevel: "start"
88
position:
9-
x: 200
10-
y: 900
11-
sourcePosition:
12-
cargo: 'top'
13-
targetPosition:
14-
smart-pointers: 'bottom'
9+
x: 400
10+
y: 940
1511
---
12+
1613
# Explorando los Auto Traits y Autoimplementaciones en Rust
1714

1815
Rust ofrece un sistema de tipos poderoso y flexible que facilita la abstracción, reutilización y seguridad. Entre sus características avanzadas, encontramos los **auto traits** y la posibilidad de realizar **autoimplementaciones** para genéricos y genéricos que cumplen ciertas condiciones (bounds). Estas herramientas permiten escribir código más expresivo y conciso, y son fundamentales para construir bibliotecas y aplicaciones robustas. En este post, exploraremos ambos temas a fondo.
@@ -44,7 +41,7 @@ Aquí, `Send` asegura que los datos pueden moverse de manera segura entre hilos.
4441

4542
### Creando Auto Traits
4643

47-
Aunque la mayoría de los auto traits relevantes ya están definidos en la biblioteca estándar (por ejemplo, `Send` y `Sync`), puedes crear los tuyos propios usando la palabra clave `unsafe auto trait`.
44+
Aunque la mayoría de los auto traits relevantes ya están definidos en la biblioteca estándar (por ejemplo, `Send` y `Sync`), puedes crear los tuyos propios usando la palabra clave `unsafe auto trait`.
4845

4946
```rust
5047
unsafe auto trait MyAutoTrait {}
@@ -103,17 +100,17 @@ let numbers: Vec<i32> = vec![1, 2, 3];
103100
println!("Sum: {}", numbers.sum()); // Output: Sum: 6
104101
```
105102

106-
En este ejemplo, la implementación del trait `Summable` para `Vec<T>` solo es válida si el tipo `T` cumple con:
103+
En este ejemplo, la implementación del trait `Summable` para `Vec<T>` solo es válida si el tipo `T` cumple con:
107104

108-
1. Implementar el operador `Add`.
109-
2. Ser `Copy`.
110-
3. Convertirse en `i32` mediante `Into<i32>`.
105+
1. Implementar el operador `Add`.
106+
2. Ser `Copy`.
107+
3. Convertirse en `i32` mediante `Into<i32>`.
111108

112109
Esto permite construir implementaciones robustas y seguras que aprovechan las capacidades del sistema de tipos de Rust.
113110

114-
## Uso Avanzado: Implementaciones Recursivas con Genéricos
111+
## Uso Avanzado: Implementaciones Recursivas con Genéricos
115112

116-
Las autoimplementaciones también se pueden utilizar para construir jerarquías de comportamiento que se basan en el sistema de tipos de Rust.
113+
Las autoimplementaciones también se pueden utilizar para construir jerarquías de comportamiento que se basan en el sistema de tipos de Rust.
117114

118115
```rust
119116
trait Flattenable {
@@ -140,15 +137,15 @@ println!("{:?}", flattened); // Output: [1, 2, 3, 4]
140137

141138
Aquí, usamos bounds genéricos para implementar un comportamiento de "aplanado" (`flatten`) para vectores de elementos que implementan `IntoIterator`. Esto permite extender la funcionalidad del tipo sin modificar su definición.
142139

143-
## Beneficios del Sistema de Auto Traits y Autoimplementaciones
140+
## Beneficios del Sistema de Auto Traits y Autoimplementaciones
144141

145-
1. **Código Reutilizable**: Puedes definir comportamiento genérico que se aplica a múltiples tipos sin duplicar código.
146-
2. **Seguridad Garantizada por el Compilador**: Los bounds genéricos aseguran que las implementaciones solo se apliquen a tipos válidos.
147-
3. **Extensibilidad**: Puedes extender tipos existentes con nuevas funcionalidades sin acceso a su código fuente.
148-
4. **Eficiencia**: Al permitir que el compilador maneje las implementaciones automáticas, se reduce el riesgo de errores y se mejora la mantenibilidad.
142+
1. **Código Reutilizable**: Puedes definir comportamiento genérico que se aplica a múltiples tipos sin duplicar código.
143+
2. **Seguridad Garantizada por el Compilador**: Los bounds genéricos aseguran que las implementaciones solo se apliquen a tipos válidos.
144+
3. **Extensibilidad**: Puedes extender tipos existentes con nuevas funcionalidades sin acceso a su código fuente.
145+
4. **Eficiencia**: Al permitir que el compilador maneje las implementaciones automáticas, se reduce el riesgo de errores y se mejora la mantenibilidad.
149146

150-
## Conclusión
147+
## Conclusión
151148

152-
Los auto traits y las autoimplementaciones para genéricos son herramientas clave en Rust que permiten aprovechar al máximo su sistema de tipos. Los auto traits, como `Send` y `Sync`, garantizan la seguridad en entornos concurrentes, mientras que las autoimplementaciones hacen que los traits sean más flexibles y reutilizables.
149+
Los auto traits y las autoimplementaciones para genéricos son herramientas clave en Rust que permiten aprovechar al máximo su sistema de tipos. Los auto traits, como `Send` y `Sync`, garantizan la seguridad en entornos concurrentes, mientras que las autoimplementaciones hacen que los traits sean más flexibles y reutilizables.
153150

154151
Con estas herramientas, puedes escribir programas más expresivos y seguros, al tiempo que reduces la complejidad del código. Dominar estas características te permitirá crear bibliotecas y aplicaciones que aprovechen todo el potencial de Rust. 🚀

content/5.traits/integrated.md renamed to content/5.traits/3.integrated.md

+34-17
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
11
---
2-
title: 'Traits Integrados'
3-
description: 'Entendiendo los Traits Más Importantes en Rust'
2+
title: "Traits Integrados"
3+
description: "Entendiendo los Traits Más Importantes en Rust"
44
draft: true
55
data:
6-
type: 'custom'
7-
topicLevel: 'start'
6+
type: "custom"
7+
topicLevel: "start"
88
position:
9-
x: 200
10-
y: 900
11-
sourcePosition:
12-
cargo: 'top'
13-
targetPosition:
14-
smart-pointers: 'bottom'
9+
x: 400
10+
y: 980
1511
---
12+
1613
### Entendiendo los Traits Más Importantes en Rust
1714

18-
Rust incluye una rica colección de *traits* estándar que permiten a los tipos integrarse con el lenguaje y aprovechar comportamientos reutilizables. Estos *traits* son contratos que los tipos pueden implementar para adquirir funcionalidades específicas. Aquí exploraremos algunos de los más importantes, explicando sus conceptos y cómo aplicarlos.
15+
Rust incluye una rica colección de _traits_ estándar que permiten a los tipos integrarse con el lenguaje y aprovechar comportamientos reutilizables. Estos _traits_ son contratos que los tipos pueden implementar para adquirir funcionalidades específicas. Aquí exploraremos algunos de los más importantes, explicando sus conceptos y cómo aplicarlos.
1916

2017
### **1. El Trait `Default`: Valores Predeterminados**
18+
2119
El trait `Default` define un método para crear un valor predeterminado para un tipo. Esto es especialmente útil al inicializar estructuras grandes con valores predecibles.
2220

2321
#### Definición
22+
2423
```rust
2524
pub trait Default {
2625
fn default() -> Self;
2726
}
2827
```
2928

3029
#### Ejemplo
30+
3131
```rust
3232
struct Config {
3333
retries: u32,
@@ -50,10 +50,12 @@ fn main() {
5050
```
5151

5252
### **2. Los Traits `Clone` y `Copy`: Clonación y Copia**
53+
5354
- **`Clone`**: Proporciona un método explícito para crear una copia profunda de un valor.
5455
- **`Copy`**: Es una versión implícita y más ligera de clonación, aplicable solo a tipos que se pueden copiar de manera trivial (como números primitivos).
5556

5657
#### Definición
58+
5759
```rust
5860
pub trait Clone {
5961
fn clone(&self) -> Self;
@@ -63,6 +65,7 @@ pub trait Copy: Clone {}
6365
```
6466

6567
#### Ejemplo
68+
6669
```rust
6770
#[derive(Clone, Copy)]
6871
struct Point {
@@ -79,14 +82,18 @@ fn main() {
7982
```
8083

8184
#### Nota sobre `Copy`
85+
8286
Un tipo que implementa `Copy` no puede tener campos que no lo implementen.
8387

8488
### **3. Comparación: `PartialEq` y `Eq`**
89+
8590
Rust proporciona dos traits para comparar tipos:
91+
8692
- **`PartialEq`**: Permite verificar si dos valores son iguales (`==`) o diferentes (`!=`).
8793
- **`Eq`**: Es un subtipo de `PartialEq` que asegura que el operador `==` siempre sea reflexivo (es decir, `a == a` siempre es verdadero).
8894

8995
#### Ejemplo
96+
9097
```rust
9198
#[derive(PartialEq, Eq)]
9299
struct User {
@@ -105,10 +112,12 @@ fn main() {
105112
```
106113

107114
### **4. Ordenamiento: `PartialOrd` y `Ord`**
115+
108116
- **`PartialOrd`**: Permite comparar valores con `<`, `>`, `<=`, `>=`.
109117
- **`Ord`**: Extiende `PartialOrd` para tipos totalmente ordenables.
110118

111119
#### Ejemplo
120+
112121
```rust
113122
#[derive(PartialOrd, Ord, PartialEq, Eq)]
114123
struct Item {
@@ -126,13 +135,15 @@ fn main() {
126135
```
127136

128137
### **5. Traits de Funciones: `Fn`, `FnMut` y `FnOnce`**
129-
Estos traits representan diferentes tipos de clausuras (*closures*).
130138

131-
- **`FnOnce`**: Consumo único.
132-
- **`FnMut`**: Clausura mutable.
139+
Estos traits representan diferentes tipos de clausuras (_closures_).
140+
141+
- **`FnOnce`**: Consumo único.
142+
- **`FnMut`**: Clausura mutable.
133143
- **`Fn`**: Clausura inmutable.
134144

135145
#### Ejemplo
146+
136147
```rust
137148
fn execute<F>(operation: F)
138149
where
@@ -147,10 +158,12 @@ fn main() {
147158
}
148159
```
149160

150-
### **6. El Trait `Drop`: Limpiar Recursos**
161+
### **6. El Trait `Drop`: Limpiar Recursos**
162+
151163
Permite ejecutar lógica personalizada cuando un valor sale de alcance.
152164

153165
#### Ejemplo
166+
154167
```rust
155168
struct Resource {
156169
name: String,
@@ -167,10 +180,12 @@ fn main() {
167180
} // `_res` se libera aquí automáticamente.
168181
```
169182

170-
### **7. Iteradores: `Iterator`**
183+
### **7. Iteradores: `Iterator`**
184+
171185
El trait `Iterator` es fundamental para trabajar con iteraciones. Define cómo un tipo produce una secuencia de valores.
172186

173187
#### Definición
188+
174189
```rust
175190
pub trait Iterator {
176191
type Item;
@@ -179,6 +194,7 @@ pub trait Iterator {
179194
```
180195

181196
#### Ejemplo
197+
182198
```rust
183199
struct Counter {
184200
count: u32,
@@ -205,5 +221,6 @@ fn main() {
205221
}
206222
```
207223

208-
### **Conclusión**
224+
### **Conclusión**
225+
209226
Estos traits estándar son esenciales en Rust, ya que forman la base para operaciones comunes como clonación, comparación, iteración y manejo de recursos. Entender cómo y cuándo usarlos es clave para aprovechar todo el potencial de Rust y escribir código más limpio, seguro y eficiente.

0 commit comments

Comments
 (0)