A generikusok lehetővé teszik, hogy olyan kódot írj, amely több típussal is működik, duplikáció nélkül. A generikus típusokat úgy definiálod, hogy csúcsos zárójeleket használsz: <T>, ahol a T bármely típus helyőrzője.
fn largest_list<T>(l1: Array<T>, l2: Array<T>) -> Array<T> {
if l1.len() > l2.len() {
l1
} else {
l2
}
}
A Cairo megköveteli a trait-korlátokat, hogy meghatározzák, milyen műveleteket kell a generikus típusnak támogatnia. A megkötéseket a + szintaxissal adhatod hozzá:
fn process_data<T, +Drop<T>, +Copy<T>>(value: T) -> T {
// Function body
}
A struktúrák is lehetnek generikusak:
#[derive(Drop)]
struct Container<T> {
value: T,
}
A trait-ek is lehetnek generikusak, így különböző típusokkal is működhetnek:
trait Processor<T> {
fn process(self: @T) -> ByteArray;
}
impl MyProcessor<T, +Drop<T>> of Processor<T> {
fn process(self: @T) -> ByteArray {
"processed"
}
}
A függvények elfogadhatnak generikus paramétereket trait-korlátokkal, így bármely olyan típussal működnek, amely megvalósítja a szükséges traitet:
fn use_processor<T, +Processor<T>, +Drop<T>>(item: T) -> ByteArray {
item.process()
}
A berlini új repülőtér fejlesztőként vett fel a robotlaborjukba. Vannak esetlen, némileg emberszerű robotjaik, amelyekkel az ügyfélszolgálatot próbálják javítani.
Első feladatod, hogy megtanítsd a robotot arra, hogy az anyanyelvükön köszöntse az embereket, miután azok beszkennelték az útlevelüket az önkiszolgáló bejelentkezőpultnál.
A robot büszke a képességeire, ezért mindig először megmondja, milyen nyelven tud beszélni, és csak utána köszönti az embert. Ha például valaki német útlevelet szkennel be, a robot ezt mondaná:
I can speak German: Hallo Dietrich!
Úgy kell felépítened a kódot, hogy te és a többi fejlesztő könnyedén új nyelveket adhassatok hozzá.
Első lépésként definiálj egy Greeter traitet két függvénnyel.
language_name, amely visszaadja azt a nyelvet (egy ByteArray), amelyen a robot köszönti a látogatót.greet, amely fogadja a látogató nevét (egy ByteArray), és visszaadja az adott nyelvű üdvözlő üzenetet (egy ByteArray).Ezután implementálj egy say_hello függvényt, amely fogadja a látogató nevét és valamit, ami megvalósítja a Greeter traitet, majd visszaadja a kívánt üdvözlés (egy ByteArray).
Képzelj el például egy német Greeter implementációt, amelynél a language_name a "German" értéket adja vissza, a greet pedig a "Hallo {name}!" értéket:
say_hello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
Most gondoskodj róla, hogy a robot az olasz útlevelet beszkennelő emberekkel is működjön.
Hozz létre egy Italian structot, és valósítsd meg a két függvényt, hogy teljesüljön az 1. feladat Greeter traitje.
Olaszul a "Ciao {name}!" szöveggel köszönthetsz valakit.
Mielőtt leteszed a munkát, hozzá kell adnod a franciául köszöntő funkciót.
Hozz létre egy French structot, és valósítsd meg a két függvényt, hogy teljesüljön a Greeter trait.
Franciául a "Bonjour {name}!" szöveggel köszönthetsz valakit.
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.