flakolefluk.dev

Aprendiendo Rust en público - Variables (3)

Hoy, continuaremos aprendiendo Rust. Seguimos en la serie de ejercicios sobre variables. Retomaremos desde el ejercicio 3, que es donde quedamos la última vez.

Ejercicio 3 #

El código inicial (con errores)

fn main() {
let x = 3;
println!("Number {}", x);
x = 5; // don't change this line
println!("Number {}", x);
}

Una vez más, el compilador no dará un error, y en este caso una posible solución.

⚠️  Compiling of exercises/variables/variables3.rs failed! Please try again. Here's the output:
error[E0384]: cannot assign twice to immutable variable `x`
--> exercises/variables/variables3.rs:9:5
|
7 | let x = 3;
| -
| |
| first assignment to `x`
| help: make this binding mutable: `mut x`
8 | println!("Number {}", x);
9 | x = 5; // don'
t change this line
| ^^^^^ cannot assign twice to immutable variable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0384`.

Como vimos en la primera parte de esta serie, las variables son inmutables por defecto en Rust, por lo tanto si ya asignamos el valor 3 a la variable x (línea 3), no podremos asignar otro valor después (línea 9). La solución, tal como indica el error, es reemplazar let por let mut al declararla.

El código corregido quedaría así.

fn main() {
let mut x = 3;
println!("Number {}", x);
x = 5; // don't change this line
println!("Number {}", x);
}

Nuestro código compila! No olvides eliminar la linea con el compentario // I AM NOT DONE para pasar al siguiente ejercicio.

Ejercicio 4 #

Antes de revisar el error en este ejercicio, demos una mirada para ver si podemos detectarlo basado en lo que hemos aprendido antes.

fn main() {
let x: i32;
println!("Number {}", x);
}

El error del compilador nos dará la respuesta.

⚠️  Compiling of exercises/variables/variables4.rs failed! Please try again. Here's the output:
error[E0381]: borrow of possibly-uninitialized variable: `x`
--> exercises/variables/variables4.rs:8:27
|
8 | println!("Number {}", x);
| ^ use of possibly-uninitialized `x`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0381`.

Estamos intentando utilizar la variable x antes de haberla inicializado.
Le dimos un tipo, es cierto, pero nunca le asignamos un valor.
Editemos el código y asignemos un valor que cumpla con la condición del tipo de variable (i32), que corresponde a un número entero con valores negativos y positivos. Los valores van desde -(2ⁿ⁻¹) a 2ⁿ⁻¹-1, con n=32 en este caso.

Una posible solución a nuestro ejercicio sería entonces:

fn main() {
let x: i32 = -83;
println!("Number {}", x);
}

Felicidades, nuestro código funciona. :)

Para seguir esta serie, puedes buscar por el tag #aprendiendo_rust