No existe NULL en Rust

No, en Rust no existe el concepto del valor nulo.

¡Con lo que nos gusta un buen Null!

Hay mucha gente que considera que la introducción del valor nulo en lenguajes de programación fue un grave y carísimo error. Y mucha de esa gente estaba entre quienes debían decidir cómo iba a ser Rust.

¿Y cómo se hace en Rust entonces?

Pues en Rust tenemos una cosa que es el:

Option<T>

Nota: dependiendo de cuál sea el lenguaje de programación del que vengas, este «<T>» seguro que se te hace raro. Es normal. Tan solo indica que ese T puede ser un tipo de dato cualquiera.

Este Option<T> admite dos valores:

  • Some()
  • None

Este none es lo que usamos como equivalente a null.

La gracia está en que cuando una función nos devuelve un Option<T> nos obliga a comprobarlo y nunca se nos «colaría» un «null». No podemos usar el Option<T> directamente, tenemos que

Te voy a poner un sencillo ejemplo donde tenemos una función transformar() que toma un número. Si ese número es mayor de 100 lo convierte en 10 y si el número es menor no lo considera válido:

fn main() {
let numero = 20;
if let Some(nuevo_valor) = transformar(numero) {
println!("El número {} se transforma en {}.", numero, nuevo_valor);
}
else {
println!("El número {} es demasiado pequeño y no merece la pena transformarlo.", numero);
}
}

fn transformar(numero: i32) -> Option<i32> {
if numero>100 {
return Some(10);
}
None
}

El funcionamiento de Option<T>

La función transformar() va a devolver un parámetro de tipo Option<i32>. Con eso estamos diciendo que la función puede devolver dos posibles valores:

  • Some(i32) -> si tiene un valor válido.
  • None -> si no hay un valor válido.

Así que si el número es mayor de 100 devolvemos un Some(10). En caso contrario devolvemos None.

Usar un Option<T>

Y ahora ¿cómo usamos este valor devuelto?

Una de las formas es usar la construcción:

if let Some(variable) = Option<T> {
   ...
}

Este if toma la variable y extrae el valor de dentro de Some() si es que lo tiene. Si nos encontramos con un None el if no se cumple.

El valor de dentro de Some() se extrae y se almacena en variable. en el ejemplo de antes se almacena en nuevo_valor.

Usar match con Option<T>

Tenemos también la opción de usar el Option<T> con match:

fn main() {
    let numero = 20;
    match transformar(numero) {
        Some(nuevo_valor) => println!("El número {} se transforma en {}.", numero, nuevo_valor),
        None => println!("El número {} es demasiado pequeño y no merece la pena transformarlo.", numero)
    };
}

¿Quieres apuntarte al «Reto diario de Rust»?

Es una forma cómoda y divertida de aprender Rust. Cada día recibes en tu email un pequeño concepto de Rust y luego tendrás que contestar a una pregunta.

De esta forma, poco a poco, pero sin descanso, irás adentrándote de manera divertida y sencilla en el apasionante mucho de Rust.

Para apuntarte solo necesitas entrar en este enlace y apuntarte:

https://urlantools.urlanheat.com/newsletter/coding-crabs-es/subscribe?o=blogcrabs

Deja un comentario