You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/5.traits/1.definition.md
+37-38
Original file line number
Diff line number
Diff line change
@@ -1,27 +1,26 @@
1
1
---
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"
4
4
draft: true
5
5
data:
6
-
type: 'custom'
7
-
topicLevel: 'start'
6
+
type: "custom"
7
+
topicLevel: "start"
8
8
position:
9
-
x: 200
9
+
x: 400
10
10
y: 900
11
11
sourcePosition:
12
-
cargo: 'top'
13
-
targetPosition:
14
-
smart-pointers: 'bottom'
12
+
traits: "left"
15
13
---
14
+
16
15
# Definiendo Traits en Rust: La Base de la Abstracción y el Comportamiento
17
16
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.
19
18
20
-
## ¿Qué es un trait y cómo se define?
19
+
## ¿Qué es un trait y cómo se define?
21
20
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.
23
22
24
-
### Ejemplo básico
23
+
### Ejemplo básico
25
24
26
25
```rust
27
26
traitGreeting {
@@ -42,9 +41,9 @@ let user = Person { name: "Alice".to_string() };
42
41
user.say_hello(); // Output: Hello, my name is Alice
43
42
```
44
43
45
-
## Métodos con implementación por defecto
44
+
## Métodos con implementación por defecto
46
45
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.
48
47
49
48
```rust
50
49
traitGreeting {
@@ -61,11 +60,11 @@ let bot = Robot;
61
60
bot.say_hello(); // Output: Hello!
62
61
```
63
62
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.
65
64
66
-
## Constantes en los traits
65
+
## Constantes en los traits
67
66
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.
69
68
70
69
```rust
71
70
traitConfigurable {
@@ -86,9 +85,9 @@ let net = Network;
86
85
println!("Max retries: {}", net.retries_allowed()); // Output: Max retries: 3
87
86
```
88
87
89
-
## Tipos asociados en los traits
88
+
## Tipos asociados en los traits
90
89
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.
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.
123
122
124
-
## Autoimplementación de traits
123
+
## Autoimplementación de traits
125
124
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**.
127
126
128
-
### Ejemplo: Implementación para todos los tipos que cumplen un trait
127
+
### Ejemplo: Implementación para todos los tipos que cumplen un trait
129
128
130
129
```rust
131
130
traitPrintable {
@@ -142,13 +141,13 @@ impl<T: std::fmt::Display> Printable for T {
142
141
"Hello, Rust!".print(); // Output: Hello, Rust!
143
142
```
144
143
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`.
146
145
147
-
## Separando lógicas con traits
146
+
## Separando lógicas con traits
148
147
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.
150
149
151
-
### Ejemplo: Modularidad con múltiples traits
150
+
### Ejemplo: Modularidad con múltiples traits
152
151
153
152
```rust
154
153
traitFlyable {
@@ -178,11 +177,11 @@ sparrow.fly(); // Output: I can fly!
178
177
goldfish.swim(); // Output: I can swim!
179
178
```
180
179
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.
182
181
183
-
## Implementaciones condicionales
182
+
## Implementaciones condicionales
184
183
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.
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.
206
205
207
-
## Ventajas del diseño con traits
206
+
## Ventajas del diseño con traits
208
207
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.
213
212
214
-
## Conclusión
213
+
## Conclusión
215
214
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.
217
216
218
217
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. 🚀
Copy file name to clipboardExpand all lines: content/5.traits/2.autotraits.md
+21-24
Original file line number
Diff line number
Diff line change
@@ -1,18 +1,15 @@
1
1
---
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"
4
4
draft: true
5
5
data:
6
-
type: 'custom'
7
-
topicLevel: 'start'
6
+
type: "custom"
7
+
topicLevel: "start"
8
8
position:
9
-
x: 200
10
-
y: 900
11
-
sourcePosition:
12
-
cargo: 'top'
13
-
targetPosition:
14
-
smart-pointers: 'bottom'
9
+
x: 400
10
+
y: 940
15
11
---
12
+
16
13
# Explorando los Auto Traits y Autoimplementaciones en Rust
17
14
18
15
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.
44
41
45
42
### Creando Auto Traits
46
43
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`.
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.
142
139
143
-
## Beneficios del Sistema de Auto Traits y Autoimplementaciones
140
+
## Beneficios del Sistema de Auto Traits y Autoimplementaciones
144
141
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.
149
146
150
-
## Conclusión
147
+
## Conclusión
151
148
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.
153
150
154
151
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. 🚀
Copy file name to clipboardExpand all lines: content/5.traits/3.integrated.md
+34-17
Original file line number
Diff line number
Diff line change
@@ -1,33 +1,33 @@
1
1
---
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"
4
4
draft: true
5
5
data:
6
-
type: 'custom'
7
-
topicLevel: 'start'
6
+
type: "custom"
7
+
topicLevel: "start"
8
8
position:
9
-
x: 200
10
-
y: 900
11
-
sourcePosition:
12
-
cargo: 'top'
13
-
targetPosition:
14
-
smart-pointers: 'bottom'
9
+
x: 400
10
+
y: 980
15
11
---
12
+
16
13
### Entendiendo los Traits Más Importantes en Rust
17
14
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.
19
16
20
17
### **1. El Trait `Default`: Valores Predeterminados**
18
+
21
19
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.
22
20
23
21
#### Definición
22
+
24
23
```rust
25
24
pubtraitDefault {
26
25
fndefault() ->Self;
27
26
}
28
27
```
29
28
30
29
#### Ejemplo
30
+
31
31
```rust
32
32
structConfig {
33
33
retries:u32,
@@ -50,10 +50,12 @@ fn main() {
50
50
```
51
51
52
52
### **2. Los Traits `Clone` y `Copy`: Clonación y Copia**
53
+
53
54
-**`Clone`**: Proporciona un método explícito para crear una copia profunda de un valor.
54
55
-**`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).
55
56
56
57
#### Definición
58
+
57
59
```rust
58
60
pubtraitClone {
59
61
fnclone(&self) ->Self;
@@ -63,6 +65,7 @@ pub trait Copy: Clone {}
63
65
```
64
66
65
67
#### Ejemplo
68
+
66
69
```rust
67
70
#[derive(Clone, Copy)]
68
71
structPoint {
@@ -79,14 +82,18 @@ fn main() {
79
82
```
80
83
81
84
#### Nota sobre `Copy`
85
+
82
86
Un tipo que implementa `Copy` no puede tener campos que no lo implementen.
83
87
84
88
### **3. Comparación: `PartialEq` y `Eq`**
89
+
85
90
Rust proporciona dos traits para comparar tipos:
91
+
86
92
-**`PartialEq`**: Permite verificar si dos valores son iguales (`==`) o diferentes (`!=`).
87
93
-**`Eq`**: Es un subtipo de `PartialEq` que asegura que el operador `==` siempre sea reflexivo (es decir, `a == a` siempre es verdadero).
88
94
89
95
#### Ejemplo
96
+
90
97
```rust
91
98
#[derive(PartialEq, Eq)]
92
99
structUser {
@@ -105,10 +112,12 @@ fn main() {
105
112
```
106
113
107
114
### **4. Ordenamiento: `PartialOrd` y `Ord`**
115
+
108
116
-**`PartialOrd`**: Permite comparar valores con `<`, `>`, `<=`, `>=`.
109
117
-**`Ord`**: Extiende `PartialOrd` para tipos totalmente ordenables.
110
118
111
119
#### Ejemplo
120
+
112
121
```rust
113
122
#[derive(PartialOrd, Ord, PartialEq, Eq)]
114
123
structItem {
@@ -126,13 +135,15 @@ fn main() {
126
135
```
127
136
128
137
### **5. Traits de Funciones: `Fn`, `FnMut` y `FnOnce`**
129
-
Estos traits representan diferentes tipos de clausuras (*closures*).
130
138
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.
133
143
-**`Fn`**: Clausura inmutable.
134
144
135
145
#### Ejemplo
146
+
136
147
```rust
137
148
fnexecute<F>(operation:F)
138
149
where
@@ -147,10 +158,12 @@ fn main() {
147
158
}
148
159
```
149
160
150
-
### **6. El Trait `Drop`: Limpiar Recursos**
161
+
### **6. El Trait `Drop`: Limpiar Recursos**
162
+
151
163
Permite ejecutar lógica personalizada cuando un valor sale de alcance.
152
164
153
165
#### Ejemplo
166
+
154
167
```rust
155
168
structResource {
156
169
name:String,
@@ -167,10 +180,12 @@ fn main() {
167
180
} // `_res` se libera aquí automáticamente.
168
181
```
169
182
170
-
### **7. Iteradores: `Iterator`**
183
+
### **7. Iteradores: `Iterator`**
184
+
171
185
El trait `Iterator` es fundamental para trabajar con iteraciones. Define cómo un tipo produce una secuencia de valores.
172
186
173
187
#### Definición
188
+
174
189
```rust
175
190
pubtraitIterator {
176
191
typeItem;
@@ -179,6 +194,7 @@ pub trait Iterator {
179
194
```
180
195
181
196
#### Ejemplo
197
+
182
198
```rust
183
199
structCounter {
184
200
count:u32,
@@ -205,5 +221,6 @@ fn main() {
205
221
}
206
222
```
207
223
208
-
### **Conclusión**
224
+
### **Conclusión**
225
+
209
226
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