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

Estadísticas de salud

Ejercicio de aprendizaje

Introducción

A menudo es útil agrupar una colección de elementos y manejar esos grupos como unidades. En Rust, llamamos a ese grupo un struct, y a cada elemento uno de los campos del struct. Un struct define el conjunto general de campos disponibles, pero un ejemplo particular 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, se hace referencia al propio struct como self. Cuando un método usa &mut self, los campos se pueden cambiar, o mutar. Cuando un método usa &self, los campos no se pueden cambiar: 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 mundo, sin dejar que nadie más mute ese valor. En Rust, estos métodos comparten idiomáticamente 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ía 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 común simplemente hacerlo público), pero son útiles si actualizar el campo debería tener efectos secundarios, o para el control de acceso: un setter marcado como pub(crate) permite que otros módulos dentro del mismo crate actualicen un campo privado, que no puede ser afectado por el mundo exterior.

Los structs vienen en tres variantes: structs con campos con nombre, structs de tupla y structs unitarios. Para este ejercicio de concepto, vamos a explorar la primera variante: structs con campos con nombre.

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

struct Item {}

Luego se incorporan tipos adicionales al cuerpo del struct como campos del struct, 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 esa breve introducción a la sintaxis de los structs ya cubierta, ¡adelante, echa un vistazo a las instrucciones de este ejercicio!

Instrucciones

Estás trabajando en la implementación de un sistema de monitoreo de salud. Como parte de eso, necesitas llevar un registro de las estadísticas de salud de los usuarios.

Empezarás con algunas funciones sin implementar 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 sin implementar de la struct User definidos en el bloque impl.

Por ejemplo, el método new debe devolver una instancia de la 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 debe devolver el peso del User.

bob.weight();
// Returns: 155.2

El método set_age debe 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 una pestaña nuevas
Rust Exercism

¿Todo 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.