Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre un tema particular.

Anuncios

Hasta ahora hemos visto variables, una macro para mostrar el contenido de las mismas e inclusive una para darles un formato antes de mostrarlas, pero en todos los casos hemos establecido el valor dentro del codigo o a lo sumo asignando una variable a otra pero que sucede cuando debemos depender de que el dato sea ingresado por el usuario? aqui entra en accion esta funcion.

Anuncios

En realidad nosotros utilizamos una funcion que se encuentra dentro del modulo io en la libreria std (std::io), a su vez esta se debe llamar como io::stdin(), despues simplemente usando una llamada por medio de read_line en esta ultima funcion nos permitira almacenar la informacion en una variable que obviamente debe ser mutable, vamos a analizar nuestro primer ejemplo.

Anuncios

Para ello vamos a crear un nuevo proyecto que llamaremos entrada, una vez generado pasamos a modificar el codigo de main.rs con el siguiente:

main.rs

use std::io;

fn main() {
	let lector: io::Stdin = io::stdin();
	let mut entrada: String = String::new();

	lector.read_line(&mut entrada).expect("Fallo lectura");
	println!("Leido {}", entrada);
}
Anuncios
Anuncios

En el primer caso lo que hacemos es importar el modulo io de la libreria std por medio de use, lo siguiente sera crear un objeto, dado que sera en realidad una variable pero esta sera del tipo Stdin que se encuentra dentro de io, aunque si la asociaremos a la funcion stdin, esta ultima basicamente sera para tener acceso a stdin por medio de este objeto, lo siguiente sera una variable mutable llamada entrada la cual sera de tipo String y la iniciaremos por medio de new para que tenga un tamaño variable permitiendonos agregar cualquier texto, analicemos la siguiente linea:

lector.read_line(&mut entrada).expect("Fallo lectura");
Anuncios

Observen que tenemos el objeto donde esta stdin (lector) luego utilizamos la funcion read_line dentro de los parentesis pasaremos la variable que generamos anteriormente por ultimo tenemos una funcion llamada expect, esta se encarga de verificar que todo esta correcto, en caso de ser asi utilizara el primer valor pero en caso contrario nos notificara mediante el mensaje que tenemos configurado, por ultimo mostramos el valor que almacenamos en entrada, ya sea el ingresado o el mensaje de falla, compilemos y veamos su salida mediante el siguiente video

Anuncios

En el video podemos ver como funciona read_line, donde espera que ingresemos la informacion por medio de stdin y una vez presionado Enter, este nos muestra el mensaje en pantalla, una cosa que no aclaramos sobre esta funcion es que encapsula dos tipos de datos, una es de tipo usize para informar el tamaño de la informacion recibida y otro io::Error que sera usado en el caso de que surja algun error en el momento de ingreso, pero tambien tenemos otra forma de manipular los posibles errores, veamos el siguiente ejemplo:

let resultado: Result<usize, io::Error> = lector.read_line(&mut entrada);

if resultado.is_err()
{
	println!("Fallo el ingreso de datos");
	return
}
Anuncios
Anuncios

En este caso creamos una variable que sera de tipo Result donde se compondra de dos tipos, uno que verifica y otro de tipo Error, en este caso pasamos el de tipo usize y el de error para que coincida con nuestra funcion, el resto es igual al que vimos anteriormente, despues tenemos un condicional donde verificamos si resultado contiene un error y en caso de ser verdadero nos lo muestra en pantalla y sale del codigo por medio de return, tambien existe una opcion mas pero es por medio de match, si bien de esta funcion hablaremos mas adelante les dejo un ejemplo:

let trimmed = entrada.trim();
let opcion: Option<i32> = trimmed.parse::<i32>.ok();

match opcion
{
	Some(i) => println!("Tu entero de la entrada: {}", i),
	None => println!("Este no es un entero: {}", trimmed)
};
Anuncios
Anuncios

Primero crearemos una variable llamada trimmed donde almacenara el valor de trim sobre nuestra variable entrada, luego crearemos otra llamada opcion a la cual haremos de tipo Option y a su vez de tipo entero de 32 bits (i32), y en este almacenaremos el resultado si despues de analizarlo por medio de parse es de tipo entero y esto es verificado gracias a la funcion ok, luego tenemos un match sobre esta ultima variable, donde usamos a Some de tipo entero, si existe un valor cualquiera de tipo entero nos mostrara ese mensaje y el valor, en cambio si tenemos un None, es decir que no tiene ningun valor porque fallo la funcion ok de la variable opcion, nos notifica que no es un entero y nos pasa el valor de trimmed, con esto hemos cubierto como usar a read_line y como manejar sus errores en varias formas.

Anuncios
Nota:
La funcion match equivale al switch de otros lenguajes pero de esto hablaremos mas adelante.
Anuncios

En resumen, hoy hemos visto a read_line, que es, para que sirve, como podemos utilizarlo, como podemos manejar errores en este y varias opciones interensantes, tambien es una opcion que nos servira mas adelante para otro uso, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50