Percursos
/
Cairo
Cairo
/
Exercícios
/
Estatísticas de saúde
Estatísticas de saúde

Estatísticas de saúde

Exercício de aprendizagem

Introdução

Muitas vezes, é útil agrupar uma coleção de itens e tratar esses grupos como unidades. Em Cairo, chamamos a esse grupo uma struct, e a cada item um dos campos da struct. Uma struct define o conjunto geral de campos disponíveis, mas um exemplo concreto de uma struct chama-se instância.

Além disso, as structs podem ter métodos definidos nelas, que têm acesso aos campos. Nesse caso, a própria struct é designada por self. Quando um método usa ref self: SomeStruct, os campos podem ser alterados, ou mutados. Quando um método usa self: SomeStruct ou self: @SomeStruct, os campos não podem ser alterados: são imutáveis. Controlar a mutabilidade ajuda o borrow-checker a garantir que classes inteiras de bugs de concorrência simplesmente não acontecem em Cairo.

Neste exercício, vais implementar dois tipos de métodos numa struct. Os primeiros são geralmente conhecidos como getters: expõem os campos da struct ao mundo exterior, sem deixar que mais ninguém mute esse valor.

Vais também implementar métodos de outro tipo, geralmente conhecidos como setters. Estes alteram o valor do campo. Os setters não são muito comuns em Cairo. Se um campo pode ser modificado livremente, é mais comum torná-lo simplesmente público. No entanto, são úteis se a atualização do campo dever produzir efeitos secundários.

As structs são definidas com a palavra-chave struct, seguida do nome do tipo que a struct descreve, com a primeira letra maiúscula:

struct Item {}

De seguida, trazem-se tipos adicionais para o corpo da struct como campos da struct, cada um com o seu próprio tipo:

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

Uma trait define um conjunto de métodos que podem ser implementados por um tipo (vamos focar-nos aqui nas structs, mas as traits também podem ser implementadas em enums). Estes métodos podem ser chamados em instâncias do tipo quando esta trait é implementada. As traits são definidas com a palavra-chave trait e, dentro das traits, definimos as assinaturas dos métodos que queremos que o nosso tipo implemente.

trait ImplTrait {
    // Define the method signature
    fn new() -> Item;
}

Por fim, os métodos podem ser definidos em structs dentro de um bloco impl, que implementa a trait definida:

impl ItemImpl of ImplTrait {
    // initializes and returns a new instance of our Item struct
    fn new() -> Item {
        Item {}
    }
}

Instruções

Estás a trabalhar na implementação de um sistema de monitorização de saúde. Como parte disso, precisas de acompanhar as estatísticas de saúde dos utilizadores.

Vais começar com algumas funções ainda por implementar num bloco impl, além da seguinte definição de struct:

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

O teu objetivo é implementar os métodos ainda por implementar no struct User definido no bloco impl.

Por exemplo, o método new deve devolver uma instância do struct User com o nome, a idade e o peso indicados.

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

O método weight deve devolver o peso do User.

bob.weight();
// Returns: 72

O método set_age deve definir a idade do User.

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

Diverte-te!

Editar via GitHub A ligação abre numa nova janela ou separador
Cairo Exercism

Estás pronto para começar Estatísticas de saúde?

Inscreve-te no Exercism para aprenderes e dominares Cairo com 25 conceitos68 exercícios, e mentoria humana real, tudo grátis.