Треки
/
Cairo
Cairo
/
Вправи
/
Статистика здоровʼя
Статистика здоровʼя

Статистика здоровʼя

Навчальна вправа

Вступ

Часто буває корисно зібрати набір елементів докупи й працювати з такими групами як з єдиним цілим. У Cairo таку групу ми називаємо struct, а кожен елемент - одним із полів цього struct. Struct визначає загальний набір доступних полів, а конкретний приклад struct називається екземпляром.

Крім того, для struct можна визначити методи, які мають доступ до полів. Сам struct у такому разі позначають як self. Коли метод використовує ref self: SomeStruct, поля можна змінювати, тобто мутувати. Коли метод використовує self: SomeStruct або self: @SomeStruct, поля змінити не можна: вони незмінні. Контроль над змінністю допомагає borrow checker гарантувати, що цілі класи помилок конкурентності у Cairo просто не трапляються.

У цій вправі ми реалізуємо два різновиди методів для struct. Перший зазвичай називають гетерами: вони показують поля struct назовні, не дозволяючи будь-кому іншому змінювати це значення.

Ми також реалізуємо методи іншого типу, які зазвичай називають сетерами. Вони змінюють значення поля. Сетери в Cairo не надто поширені: якщо поле можна вільно змінювати, його зазвичай просто роблять публічним. Але вони стануть у пригоді, якщо оновлення поля має спричиняти побічні ефекти.

Struct визначають за допомогою ключового слова struct, після якого йде назва типу з великої літери, який цей struct описує:

struct Item {}

Далі до тіла struct додають додаткові типи як поля struct, кожне зі своїм типом:

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

Trait визначає набір методів, які може реалізувати тип (тут ми зосередимося на struct, але trait можна реалізувати і для enum). Ці методи можна викликати на екземплярах типу, коли цей trait реалізовано. Trait визначають за допомогою ключового слова trait, і всередині trait ми визначаємо сигнатури методів, які хочемо, щоб реалізував наш тип.

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

І нарешті, методи можна визначати для struct усередині блоку impl, який реалізує визначений trait:

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

Вказівки

Ми працюємо над реалізацією системи моніторингу здоровʼя. У межах цієї роботи нам потрібно відстежувати статистику здоровʼя користувачів.

Ми почнемо з кількох функцій-заглушок у блоці impl, а також з такого визначення структури:

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

Наша мета - реалізувати методи-заглушки, визначені в блоці impl для User struct.

Наприклад, метод new має повертати екземпляр структури User із зазначеними значеннями імені, віку та ваги.

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

Метод weight має повертати вагу User.

bob.weight();
// Returns: 72

Метод set_age має встановлювати вік User.

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

Гарно провести час!

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Cairo Exercism

Час розпочати Статистика здоровʼя?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Cairo, а також 25 концепцій68 вправ та справжнє наставництво від людей, і все це безкоштовно.