Skip to content

Commit ee324e3

Browse files
authored
Merge pull request #10 from RustLangES/content-basic
[CONTENT] Agregando el contenido "Basico del Lenguaje"
2 parents d7823f6 + 09b7417 commit ee324e3

32 files changed

+3974
-0
lines changed

bun.lockb

216 Bytes
Binary file not shown.
File renamed without changes.

content/2.basic/1.syntax.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
title: 'Sintaxis Básica'
2+
description: ''
3+
data:
4+
type: 'transparent'
5+
topicLevel: 'start'
6+
position:
7+
x: -700
8+
y: 200
9+
width: 320
10+
align: 'center'
11+
sourcePosition:
12+
none: 'top'
13+
targetPosition:
14+
basic: 'right'
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
---
2+
title: 'Transferencia de Ownership'
3+
description: 'Transferencias de Ownership en Rust: Un Cambio Fundamental en la Gestión de Recursos'
4+
draft: true
5+
data:
6+
type: 'custom'
7+
topicLevel: 'start'
8+
position:
9+
x: -700
10+
y: 600
11+
width: 320
12+
externalLinks:
13+
- name: 'Libro Oficial'
14+
english: false
15+
link: 'https://book.rustlang-es.org/ch04-01-what-is-ownership?highlight=transferencia#valores-de-retorno-y-alcance'
16+
---
17+
## Transferencias de Ownership en Rust: Un Cambio Fundamental en la Gestión de Recursos
18+
19+
### Introducción
20+
21+
Rust es un lenguaje de programación que ha capturado la atención de desarrolladores por su enfoque único en la seguridad y el rendimiento. Un aspecto crucial que diferencia a Rust de otros lenguajes es su sistema de **ownership (propiedad)**. La **transferencia de ownership** es una característica clave de este sistema, que permite manejar la memoria de manera segura y eficiente. En este post, exploraremos en detalle cómo funcionan las transferencias de ownership en Rust y por qué son fundamentales para el paradigma de gestión de recursos del lenguaje.
22+
23+
### Concepto de Ownership en Rust
24+
25+
En Rust, cada valor en el programa tiene un único propietario. Esta variable propietaria es responsable de liberar los recursos asociados cuando sale del alcance (scope). Este enfoque asegura que no haya duplicaciones de liberación de memoria ni fugas de memoria, proporcionando una seguridad robusta en tiempo de compilación.
26+
27+
### ¿Qué es la Transferencia de Ownership?
28+
29+
La transferencia de ownership ocurre cuando un valor se mueve de una variable a otra, transfiriendo con ello la responsabilidad de gestionar ese valor. En Rust, esto se conoce como "mover" (move). Una vez que un valor ha sido movido, la variable original ya no puede usarse para acceder al valor, evitando así accesos inválidos a memoria.
30+
31+
### Ejemplo de Transferencia de Ownership
32+
33+
Consideremos el siguiente ejemplo para ilustrar cómo funciona la transferencia de ownership:
34+
35+
```rust
36+
fn main() {
37+
let s1 = String::from("Hello");
38+
let s2 = s1; // s1 se mueve a s2
39+
println!("{}", s2); // Esto funciona
40+
// println!("{}", s1); // Esto causaría un error de compilación
41+
}
42+
```
43+
44+
En este código, la cadena `"Hello"` se asigna a `s1`. Luego, `s1` se mueve a `s2`, transfiriendo la propiedad. Intentar usar `s1` después de la transferencia causará un error de compilación porque `s1` ya no es válido.
45+
46+
### Transferencias de Ownership en Funciones
47+
48+
Las transferencias de ownership también ocurren cuando se pasan parámetros a funciones y cuando se retornan valores desde funciones. Veamos un ejemplo:
49+
50+
```rust
51+
fn main() {
52+
let s1 = String::from("Hello");
53+
takes_ownership(s1); // s1 se mueve a la función
54+
// println!("{}", s1); // Esto causaría un error de compilación
55+
}
56+
57+
fn takes_ownership(some_string: String) {
58+
println!("{}", some_string);
59+
}
60+
```
61+
62+
En este caso, `s1` se mueve a la función `takes_ownership`, transfiriendo la propiedad. Una vez que `s1` ha sido movido, ya no puede usarse en `main`.
63+
64+
### Retorno de Valores y Ownership
65+
66+
Rust también permite transferir ownership cuando se retorna un valor desde una función:
67+
68+
```rust
69+
fn main() {
70+
let s1 = gives_ownership();
71+
println!("{}", s1);
72+
}
73+
74+
fn gives_ownership() -> String {
75+
let some_string = String::from("Hello");
76+
some_string // se mueve al llamador
77+
}
78+
```
79+
80+
Aquí, la función `gives_ownership` crea una cadena y luego la retorna, transfiriendo la propiedad al llamador.
81+
82+
### Clonación: Copias en Lugar de Movimientos
83+
84+
En algunos casos, es posible que desees hacer una copia en lugar de mover un valor. Rust permite esto mediante el método `clone`, que crea una copia profunda del valor:
85+
86+
```rust
87+
fn main() {
88+
let s1 = String::from("Hello");
89+
let s2 = s1.clone(); // Se clona s1
90+
println!("{}", s1); // Esto funciona
91+
println!("{}", s2); // Esto también funciona
92+
}
93+
```
94+
95+
### Beneficios de la Transferencia de Ownership
96+
97+
1. **Seguridad en Tiempo de Compilación:** Al transferir ownership de manera explícita, Rust asegura que no haya accesos inválidos a memoria ni liberaciones duplicadas.
98+
99+
2. **Control de Recursos:** La transferencia de ownership proporciona un control preciso sobre la vida útil de los recursos, lo que es crucial para el rendimiento y la eficiencia.
100+
101+
3. **Prevención de Errores Comunes:** Errores como las fugas de memoria y las condiciones de carrera se evitan gracias a las reglas de ownership y borrowing.
102+
103+
### Conclusión
104+
105+
La transferencia de ownership es un concepto central en Rust que redefine cómo gestionamos la memoria y los recursos. Al asegurar que cada valor tenga un único propietario y al validar las transferencias de ownership en tiempo de compilación, Rust proporciona un nivel de seguridad y eficiencia que es difícil de alcanzar en otros lenguajes. Aunque puede requerir un cambio de mentalidad para los desarrolladores acostumbrados a otros paradigmas, los beneficios que ofrece en términos de seguridad y control hacen que valga la pena adoptar este enfoque.
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
---
2+
title: 'Referencias y Mutabilidad'
3+
description: 'Referencias y Mutabilidad en Rust: Un Enfoque Seguro para la Gestión de Datos'
4+
draft: true
5+
data:
6+
type: 'custom'
7+
topicLevel: 'start'
8+
position:
9+
x: -700
10+
y: 640
11+
width: 320
12+
externalLinks:
13+
- name: 'Libro Oficial'
14+
english: false
15+
link: 'https://book.rustlang-es.org/ch04-02-references-and-borrowing'
16+
---
17+
## Referencias y Mutabilidad en Rust: Un Enfoque Seguro para la Gestión de Datos
18+
19+
### Introducción
20+
21+
Rust es un lenguaje de programación que se destaca por su enfoque en la seguridad y la eficiencia. Dos conceptos fundamentales que contribuyen a estos objetivos son las **referencias** y la **mutabilidad**. En este post, exploraremos cómo Rust maneja las referencias y la mutabilidad, y cómo estos conceptos trabajan juntos para proporcionar un sistema de gestión de memoria seguro y eficiente.
22+
23+
### Referencias: Acceso Seguro a los Datos
24+
25+
En Rust, una **referencia** es un tipo que permite acceder a los datos sin tomar la propiedad de ellos. Las referencias se crean utilizando el operador `&`, y pueden ser inmutables o mutables.
26+
27+
#### Referencias Inmutables
28+
29+
Una referencia inmutable permite leer los datos pero no modificarlos. Se crean utilizando `&`:
30+
31+
```rust
32+
fn main() {
33+
let s = String::from("Hello");
34+
let len = calculate_length(&s); // Se pasa una referencia inmutable
35+
println!("La longitud de '{}' es {}.", s, len);
36+
}
37+
38+
fn calculate_length(s: &String) -> usize {
39+
s.len() // Solo lectura
40+
}
41+
```
42+
43+
**Gráfico 1: Referencia Inmutable**
44+
45+
```plaintext
46+
+-------+ +----------------------+
47+
| s |-----> | "Hello" |
48+
+-------+ +----------------------+
49+
|
50+
v
51+
+-------+ +----------------------+
52+
| len | | calculate_length(&s) |
53+
+-------+ +----------------------+
54+
```
55+
56+
#### Referencias Mutables
57+
58+
Una referencia mutable permite tanto leer como modificar los datos. Se crean utilizando `&mut`:
59+
60+
```rust
61+
fn main() {
62+
let mut s = String::from("Hello");
63+
change(&mut s); // Se pasa una referencia mutable
64+
println!("{}", s);
65+
}
66+
67+
fn change(s: &mut String) {
68+
s.push_str(", world"); // Modifica la cadena
69+
}
70+
```
71+
72+
**Gráfico 2: Referencia Mutable**
73+
74+
```plaintext
75+
+-----------+ +----------------------+
76+
| s |-----> | "Hello" |
77+
+-----------+ +----------------------+
78+
|
79+
v
80+
+-----------+ +----------------------+
81+
| change | | change(&mut s) |
82+
+-----------+ | "Hello, world" |
83+
```
84+
85+
### Reglas de las Referencias
86+
87+
Rust aplica estrictas reglas para el uso de referencias, garantizando la seguridad y evitando condiciones de carrera:
88+
89+
1. **Solo una referencia mutable a la vez:** No puede haber más de una referencia mutable a un dato en un momento dado.
90+
2. **No se permiten referencias mutables mientras existan referencias inmutables:** Un dato no puede tener una referencia mutable si existe alguna referencia inmutable activa.
91+
92+
#### Ejemplo de Violación de Reglas
93+
94+
Intentar violar estas reglas resultará en un error de compilación. Por ejemplo:
95+
96+
```rust
97+
fn main() {
98+
let mut s = String::from("Hello");
99+
let r1 = &s; // Referencia inmutable
100+
let r2 = &s; // Otra referencia inmutable
101+
let r3 = &mut s; // Error: no se puede tener una referencia mutable mientras existan referencias inmutables
102+
}
103+
```
104+
105+
**Gráfico 3: Violación de Reglas de Referencia**
106+
107+
```plaintext
108+
+-----------+ +----------------------+
109+
| s |-----> | "Hello" |
110+
+-----------+ +----------------------+
111+
| |
112+
| +-> r1 (inmutable)
113+
|
114+
+-> r2 (inmutable)
115+
|
116+
+-> r3 (mutable) - Error!
117+
```
118+
119+
### Beneficios de las Reglas de Referencias
120+
121+
1. **Seguridad en Tiempo de Compilación:** Las reglas de referencias de Rust aseguran que no haya accesos concurrentes inseguros a los datos, eliminando condiciones de carrera.
122+
2. **Control de la Mutabilidad:** Al restringir la mutabilidad a una única referencia a la vez, Rust evita modificaciones no controladas y mantiene la integridad de los datos.
123+
3. **Prevención de Errores Comunes:** Muchos errores comunes en la programación, como los punteros colgantes y los accesos a memoria no válida, se previenen mediante estas reglas.
124+
125+
### Ejemplos Prácticos de Uso de Referencias y Mutabilidad
126+
127+
#### Ejemplo 1: Contador de Referencias
128+
129+
Un contador de referencias puede beneficiarse de las reglas de referencias de Rust para mantener un conteo seguro:
130+
131+
```rust
132+
fn main() {
133+
let count = 5;
134+
let r1 = &count;
135+
let r2 = &count;
136+
137+
println!("r1: {}, r2: {}", r1, r2);
138+
}
139+
```
140+
141+
**Gráfico 4: Contador de Referencias**
142+
143+
```plaintext
144+
+---------+ +-------------+
145+
| count |-----> | 5 |
146+
+---------+ +-------------+
147+
| |
148+
| +-> r1 (inmutable)
149+
|
150+
+-> r2 (inmutable)
151+
```
152+
153+
#### Ejemplo 2: Modificación Controlada
154+
155+
Controlar la modificación de un valor en una función sin transferir la propiedad:
156+
157+
```rust
158+
fn main() {
159+
let mut x = 10;
160+
add_five(&mut x);
161+
println!("x: {}", x);
162+
}
163+
164+
fn add_five(n: &mut i32) {
165+
*n += 5;
166+
}
167+
```
168+
169+
**Gráfico 5: Modificación Controlada**
170+
171+
```plaintext
172+
+---------+ +-------------+
173+
| x |-----> | 10 |
174+
+---------+ +-------------+
175+
|
176+
v
177+
+---------+ +-------------+
178+
| add_five| | 10 + 5 |
179+
+---------+ | 15 |
180+
```
181+
182+
### Conclusión
183+
184+
Las referencias y la mutabilidad son conceptos esenciales en Rust que proporcionan un enfoque seguro y eficiente para la gestión de datos. Al aplicar estrictas reglas en tiempo de compilación, Rust garantiza la seguridad de la memoria y previene errores comunes en la programación. Estos mecanismos permiten a los desarrolladores escribir código robusto y libre de condiciones de carrera, mejorando la calidad y fiabilidad de las aplicaciones. Adoptar y comprender estos conceptos es crucial para aprovechar al máximo las capacidades de Rust y crear software seguro y eficiente.

0 commit comments

Comments
 (0)