|
| 1 | +--- |
| 2 | +nextPath: "bool-and-float" |
| 3 | +previousPath: "constants" |
| 4 | +expectedResponse: "El valor final es: 15\n" |
| 5 | +initialCode: | |
| 6 | + fn main() { |
| 7 | + // Crea la variable valor con el string "10" |
| 8 | +
|
| 9 | + // Asigna el parseo a un entero usando shadowing a la variable valor |
| 10 | + |
| 11 | + valor.parse::<i32>().expect("No es un número"); |
| 12 | +
|
| 13 | + // Suma 5 al valor |
| 14 | +
|
| 15 | + // Muestra el resultado |
| 16 | + println!("El valor final es: {valor}"); |
| 17 | + } |
| 18 | +order: 9 |
| 19 | +--- |
| 20 | + |
| 21 | +# Shadowing |
| 22 | + |
| 23 | +En Rust, cuando declaramos una variable con `let`, su nombre queda asociado a un valor en memoria. |
| 24 | +El **shadowing** ocurre cuando volvemos a declarar una variable con el mismo nombre que otra anterior, usando nuevamente `let`. Esto *sombrea* (shadow) la variable anterior, es decir, la nueva declaración la reemplaza en el alcance actual. |
| 25 | + |
| 26 | +Lo importante es que, a diferencia de hacer la variable `mut`, el shadowing nos permite: |
| 27 | + |
| 28 | +* **Cambiar el valor** asociado a la variable. |
| 29 | +* **Cambiar el tipo** de la variable. |
| 30 | + |
| 31 | +Ejemplo: |
| 32 | + |
| 33 | +```rust |
| 34 | +fn main() { |
| 35 | + let x = 5; // x es un número entero |
| 36 | + let x = x + 1; // x ahora vale 6 |
| 37 | + let x = "texto"; // x ahora es un string, diferente tipo |
| 38 | + println!("{x}"); |
| 39 | +} |
| 40 | +``` |
| 41 | + |
| 42 | +En este caso, la variable `x` cambia tanto de valor como de tipo, algo que no sería posible con `mut`. Esto lo hace muy útil para transformar datos paso a paso sin necesidad de inventar nuevos nombres de variables. |
| 43 | + |
| 44 | +--- |
| 45 | + |
| 46 | +### 📝 Ejercicio |
| 47 | + |
| 48 | +Crea un programa que: |
| 49 | + |
| 50 | +1. Defina una variable llamada `valor` con el número `10`. |
| 51 | +2. Use **shadowing** para: |
| 52 | + * Parsear `valor` a un entero. |
| 53 | + * Para esto usaremos el método `parse::<i32>()` que convierte un string a un entero de 32 bits. |
| 54 | + * Como `parse` puede fallar, usaremos `expect("No es un número")` para manejar el caso de error. |
| 55 | +3. Luego **suma** `5` al valor. |
| 56 | +4. Imprime el resultado final. |
| 57 | + |
0 commit comments