Rutas
/
Rust
Rust
/
Ejercicios
/
Estadísticas de salud
Estadísticas de salud

Estadísticas de salud

Ejercicio de aprendizaje

Introducción

A menudo resulta útil agrupar una colección de elementos y tratar esos grupos como unidades. En Rust llamamos struct a un grupo así, y cada elemento es uno de los campos del struct. Un struct define el conjunto general de campos disponibles, pero un ejemplo concreto de un struct se llama instancia.

Además, los structs pueden tener métodos definidos en ellos, que tienen acceso a los campos. En ese caso, el propio struct recibe el nombre de self. Cuando un método usa &mut self, los campos pueden cambiarse, o mutarse. Cuando un método usa &self, los campos no pueden cambiarse: son inmutables. Controlar la mutabilidad ayuda al borrow checker a garantizar que clases enteras de bugs de concurrencia simplemente no ocurran en Rust.

En este ejercicio vas a implementar dos tipos de métodos en un struct. Los primeros se conocen generalmente como getters: exponen los campos del struct al exterior, sin permitir que nadie más mute ese valor. En Rust, estos métodos comparten de manera idiomática el nombre del campo que exponen; es decir, si tenemos un método getter que obtiene un campo del struct llamado name, el método simplemente se llamará name().

También vas a implementar métodos de otro tipo, conocidos generalmente como setters. Estos cambian el valor del campo. Los setters no son muy comunes en Rust (si un campo se puede modificar libremente, es más habitual hacerlo simplemente público), pero son útiles si actualizar el campo debe tener efectos secundarios o para el control de acceso: un setter marcado como pub(crate) permite a otros módulos del mismo crate actualizar un campo privado, que no puede verse afectado desde fuera.

Hay tres variantes de structs: structs con campos con nombre, structs de tupla y structs unitarios. Para este ejercicio de concepto, exploraremos la primera variante: los structs con campos con nombre.

Los structs se definen con la palabra clave struct, seguida del nombre del tipo que describe el struct, con la primera letra en mayúscula:

struct Item {}

A continuación, se añaden otros tipos al cuerpo del struct como campos de este, cada uno con su propio tipo:

struct Item {
    name: String,
    weight: f32,
    worth: u32,
}

Por último, se pueden definir métodos en los structs dentro de un bloque impl:

impl Item {
    // initializes and returns a new instance of our Item struct
    fn new() -> Self {
        todo!()
    }
}

Con esta breve introducción a la sintaxis de los structs, ¡echa un vistazo a las instrucciones de este ejercicio!

Instrucciones

Estás trabajando en la implementación de un sistema de monitorización de la salud. Como parte de ello, necesitas hacer un seguimiento de las estadísticas de salud de los usuarios.

Empezarás con algunos métodos esbozados en un bloque impl, además de la siguiente definición de struct:

pub struct User {
    name: String,
    age: u32,
    weight: f32,
}

Tu objetivo es implementar los métodos esbozados del struct User definido en el bloque impl.

Por ejemplo, el método new debería devolver una instancia del struct User con los valores especificados de nombre, edad y peso.

let mut bob = User::new(String::from("Bob"), 32, 155.2);
// Returns: a User with name "Bob", age 32, and weight 155.2

El método weight debería devolver el peso del User.

bob.weight();
// Returns: 155.2

El método set_age debería establecer la edad del User.

bob.set_age(33);
// Updates Bob's age to 33; happy birthday Bob!

¡Diviértete!

Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Rust Exercism

¿Listo para empezar Estadísticas de salud?

Regístrate en Exercism para aprender y dominar Rust con 99 ejercicios y mentoría humana real, todo gratis.