flakolefluk.dev

Aprendiendo Rust en público - Variables (2)

Siguiendo con el proceso de aprendizaje de Rust, usando rustlings como guía. Continuaremos con la serie de ejercicios de variables.

Ejercicio 2 #

El código inicial (con errores)

fn main() {
let x;
if x == 10 {
println!("Ten!");
} else {
println!("Not ten!");
}
}

Felizmente Rust es muy claro (y amable) cuando nos muestra los errores.

⚠️  Compiling of exercises/variables/variables2.rs failed! Please try again. Here's the output:
error[E0282]: type annotations needed
--> exercises/variables/variables2.rs:7:9
|
7 | let x;
| ^ consider giving `x` a type

error: aborting due to previous error

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

Ok. El compilador nos indica que debemos ponerle un tipo a nuestra variable.
En el ejercicio anterior no tuvimos que poner un tipo. ¿por qué?

Del capítulo 3.2 del libro de rust:
El compilador puede inferir el tipo de una variable basado en el valor que se le asigna inicialmente. Si este no es el caso, el compilador debe saber (gracias a nosotros) qué tipo de valor se le asignará.

En este ejercicio en particular tenemos muchas opciones.
La expresión if x == 10 nos da algunas opciones. Podríamos decir que x es un entero positivo.

La siguiente tabla muestra las posibilidades cuando lidiamos con enteros.

Para la lista de tipos de números enteros visita este link

Como no tenemos contexto para ejercicio ni un requerimiento en particular, le daré el tipo que use menos memoria (Ver tabla en el link anterior) que pueda ser positivo. Este sería: u8, que nos permitiría asignar un valor entre 0 y 255 (y compararlo con el valor 10 del ejercicio)

Nuestro ejercicio quedará ahora de la siguiente manera:

fn main() {
let x:u32;
if x == 10 {
println!("Ten!");
} else {
println!("Not ten!");
}
}

Sin embargo, al intentar nuestro código, tenemos un nuevo error.

⚠️  Compiling of exercises/variables/variables2.rs failed! Please try again. Here's the output:
error[E0381]: use of possibly-uninitialized variable: `x`
--> exercises/variables/variables2.rs:8:8
|
8 | if x == 10 {
| ^ use of possibly-uninitialized `x`

error: aborting due to previous error

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

El error es bastante claro y nos indica que no inicializamos la variabe x a ningún valor antes de usarla en la expresión if x == 10.
Para resolver este error podemos inicializar el valor en el momento de declarar la variable o en cualquier otro momento antes de utilizarla.

Posibles soluciones:

fn main() {
let x: u8;
x = 7; // cualquier numero entre 0 y 255 sirve
if x == 10 {
println!("Ten!");
} else {
println!("Not ten!");
}
}
fn main() {
let x: u8 = 7;
if x == 10 {
println!("Ten!");
} else {
println!("Not ten!");
}
}

Ahora sí. Nuestro ejercicio compila.

Nota: Omití la explicación del if else ya que revisando los ejerciciós noté que será un tema que se tocará más adelante. Si quieres revisar más información al respecto, puedes revisar esta sección del libro

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