Gyakran hasznos, ha elemek egy csoportját összefogjuk, és ezeket a csoportokat egységként kezeljük. Caióban egy ilyen csoportot struct-nak, az egyes elemeket pedig a struct mezőinek nevezzük. A struct az elérhető mezők általános körét definiálja, egy konkrét példányát viszont példánynak nevezzük.
Ráadásul a struct-okhoz metódusokat is definiálhatunk, amelyek hozzáférnek a mezőkhöz.
Ilyenkor magára a structra self-ként hivatkozunk.
Amikor egy metódus ref self: SomeStruct formát használ, a mezők megváltoztathatók, azaz mutálhatók.
Amikor egy metódus self: SomeStruct vagy self: @SomeStruct formát használ, a mezők nem változtathatók meg: változtathatatlanok.
A változtathatóság szabályozása segít a borrow-checkernek biztosítani, hogy a konkurenciával kapcsolatos hibák egész kategóriái egyszerűen elő se forduljanak Caióban.
Ebben a feladatban kétféle metódust fogsz megvalósítani egy structon. Az első típust általában getternek nevezik: ezek hozzáférhetővé teszik a struct mezőit a külvilág számára, anélkül hogy bárki más módosíthatná azt az értéket.
Emellett egy másik típusú metódust is megvalósítasz, amelyeket általában setternek neveznek. Ezek megváltoztatják a mező értékét. A setterek nem túl gyakoriak Caióban (ha egy mező szabadon módosítható, gyakoribb, hogy egyszerűen nyilvánossá tesszük), de akkor hasznosak, ha a mező frissítésének mellékhatásai vannak.
A struct-okat a struct kulcsszóval definiáljuk, amelyet a struct által leírt típus nagy kezdőbetűs neve követ:
struct Item {}
Ezután további típusokat viszünk be a struct testébe a struct mezőiként, mindegyiket a saját típusával:
struct Item {
name: String,
weight: f32,
worth: u32,
}
A trait olyan metódusok halmazát definiálja, amelyeket egy típus implementálhat (itt most a structokra összpontosítunk, de trait-eket enumokon is implementálhatunk).
Ezeket a metódusokat a típus példányain hívhatjuk meg, ha ezt a trait-et implementáltuk.
A trait-eket a trait kulcsszóval definiáljuk, és a trait-eken belül adjuk meg azokat a metódusszignatúrákat, amelyeket a típusunknak implementálnia kell.
trait ImplTrait {
// Define the method signature
fn new() -> Item;
}
Végül a metódusokat structokon is definiálhatjuk egy impl blokkon belül, amely a megadott trait-et implementálja:
impl ItemImpl of ImplTrait {
// initializes and returns a new instance of our Item struct
fn new() -> Item {
Item {}
}
}
Éppen egy egészségfigyelő rendszer megvalósításán dolgozol. Ennek részeként nyomon kell követned a felhasználók egészségügyi statisztikáit.
Kezdetnek néhány csonkolt függvénnyel indulsz egy impl blokkban, valamint a következő struct-definícióval:
pub struct User {
name: String,
age: u32,
weight: u32,
}
A célod, hogy implementáld a User struct impl blokkban definiált csonkolt metódusait.
Például a new metódusnak egy User struct egy példányát kell visszaadnia a megadott névvel, életkorral és súllyal.
let mut bob = User::new("Bob", 32, 72);
// Returns: a User with name "Bob", age 32, and weight 72
A weight metódusnak vissza kell adnia a User súlyát.
bob.weight();
// Returns: 72
A set_age metódusnak be kell állítania a User életkorát.
bob.set_age(33);
// Updates Bob's age to 33; happy birthday Bob!
Jó szórakozást!
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Cairo nyelvet 25 fogalom68 feladat segítségével, valódi emberi mentorálással, mindez ingyen.