martes, 19 de marzo de 2019

Creando videojuegos en Rust lang (Parte 3)

Antes de usar un paquete de un motor de juegos decidí realizar un pequeño "Hola mundo" usando sólo herramientas básicas de Rust. También sirve como una prueba para ver si puedo mostrar código de Rust en el Blog. Para generar el formato usaré la página hilite.me que me genera el código HTML que tengo que pegar al Blog para que se vea con formato.

Este es un pequeño programa que lee un número de la consola y lo imprime de vuelta. Está basado en la primera parte del tutorial donde se guía a crear un juego de adivina el número en el libro de Rust: https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html

Hice un directorio llamado "demo_guess_game" usando cargo new. Y el código que usé y modifiqué en el "main.rs" es el siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
use std::io;

fn main() {
    println!("¡Adivina el número!");

    println!("Por favor, inserte el número que desea adivinar.");

    let mut guess = String::new();

    io::stdin().read_line(&mut guess)
        .expect("Hubo un fallo al leer la línea");

    println!("El número que intentó es: {}", guess);
}

Desde la última entrada descubrí que la razón por la que no se podía ejecutar bien el "cargo build" era porque mi antivirus lo marcaba como amenaza y lo escaneaba. Resolví esto ajustando mi antivirus para que no lo marque como amenaza. Entonces, el resultado de ejecutar cargo build y cargo run fue el siguiente:
Demostración del resultado de correr el código anterior
Hay muchas características de Rust que se demuestran en este simple programa. Estas características se explican con más detalle en el vínculo. A fin que estos conceptos no causen problema más adelante este es un resumen de algunos de las características importantes del código:
  • use std::io; está linea sirve para llamar la librería estándar y obtener los métodos de entrada y salida (input/output, io). En este caso la función "read_line" que usamos en la línea 10.
  • fn main() { es una declaración del método "main". La ejecución del código siempre empieza en el método "main".
  • println!("¡Adivina el número!"); la parte que dice println! es una macro. Las macros es una forma poderosa de escribir código que se desdobla en más código. Durante la compilación se convierten en líneas de código separadas, es decir usar una macro es un atajo para ahorrarnos escribir líneas de código individuales. Otra cosa que resaltar es que Rust nos aceptó los caracteres en español "¡" y "ú"; y también está mostrando estos correctamente en la consola.
  • let mut guess = String::new(); esta línea crea/declara ("let") una variable modificable ("mut") llamada "guess" y esta se liga a un objecto String modificable. De forma predeterminada en Rust todos los tipos básicos son fijos y no se pueden modificar
  • io::stdin().read_line(&mut guess).expect("Hubo un fallo al leer la línea"); es la línea más complicada porque llama la función "stdin" del paquete "io", llama el método "read_line" para leer una línea. Este método "read_line" requiere que le prestemos una referencia mutable a la variable "guess" para que la actualice y nos la regrese a "main" (el dueño de la variable). Esto se tiene que hacer de esta forma por la lógica de Rust en donde de forma predeterminada las variables no son modificables/mutables. Finalmente la parte final de ".expect" sirve para regresar el resultado o imprimir el error "Hubo un fallo al leer la línea" en caso que falle el método del sistema que llamamos. 
  • println!("El número que intentó es: {}", guess); esta línea usa "{}" para indicar donde se colocarán las variables, en este caso "guess" es la única variable. En este caso está macro nos ayuda a imprimir la variable.
Para entender más detalles de como funciona Rust recomiendo buscar más ejemplos en línea o buscar libros de Rust. Pueden de hecho usar el libro virtual gratuito: https://doc.rust-lang.org/book. Sin embargo, para fines de este blog intentaré dar un resumen de todos los nuevos componentes en la medida que se vallan introduciendo y en la medida que me enfrente a errores al intentar correr estos ejemplos.

Navegación:
Primera parte
Siguiente parte
Parte anterior

No hay comentarios.:

Publicar un comentario