A tuple könnyed módja annak, hogy egy rögzített, tetszőleges típusú adathalmazt együtt csoportosítsunk. A tuple-nek nincs külön neve; ha nevet adunk egy adatszerkezetnek, azzal struct-tá válik. A tuple mezőinek sincsenek nevei; a mezőkhoz destrukturálással vagy pozíció alapján férhetsz hozzá.
A tuple mindig tuple-kifejezéssel jön létre:
// pointless but legal
let unit = ();
// single element
let single_element = ("note the comma",);
// two element
let two_element = (123, "elements can be of differing types");
A tuple-oknak tetszőleges számú elemük lehet.
A tuple elemeihez destrukturálással is hozzáférhetsz. Ez egyszerűen azt jelenti, hogy a tuple egyes elemeihez változóneveket rendelsz, és ezzel felhasználod a tuple-t.
let (elem1, _elem2) = two_element;
assert_eq!(elem1, 123);
A tuple elemeihez numerikus pozíció szerinti indexszel is hozzáférhetsz. Az indexelés, mint mindig, 0-tól kezdődik.
let notation = single_element.0;
assert_eq!(notation, "note the comma");
Tuple structokkal is dolgoznod kell majd. A hagyományos structokhoz hasonlóan ezek is elnevezett típusok; a hagyományos structoktól eltérően viszont névtelen mezőik vannak. A szintaxisuk nagyon hasonlít a hagyományos tuple szintaxisához. A destrukturálás és a pozíció szerinti elérés egyaránt megengedett.
struct TupleStruct(u8, i32);
let my_tuple_struct = TupleStruct(123, -321);
let neg = my_tuple_struct.1;
let TupleStruct(byte, _) = my_tuple_struct;
assert_eq!(neg, -321);
assert_eq!(byte, 123);
A névtelen tuple-ok mezői mindig nyilvánosak. A tuple structok mezőinek viszont külön-külön van láthatóságuk, amely alapértelmezés szerint privát, akárcsak a hagyományos structok mezői esetében. A mezőket a pub módosítóval teheted nyilvánossá, csakúgy, mint egy hagyományos structban.
// fails due to private fields
mod tuple { pub struct TupleStruct(u8, i32); }
fn main() { let _my_tuple_struct = tuple::TupleStruct(123, -321); }
// succeeds: fields are public
mod tuple { pub struct TupleStruct(pub u8, pub i32); }
fn main() { let _my_tuple_struct = tuple::TupleStruct(123, -321); }
Egy alacsony fogyasztású beágyazott rendszerre szánt játékon dolgozol, és több kényelmi függvényt kell írnod, amelyeket a játék más részei fognak használni.
A hányados egy osztás eredménye.
fn divmod(dividend: i16, divisor: i16) -> (i16, i16)
Példa:
assert_eq!(divmod(10, 3), (3, 1));
A főnököd szerint ez majd segít egy képernyőpuffer-optimalizálást bevezetni.
Az iterátorok olyan elemek, amelyek az Iterator trait által definiált metódusokat teszik elérhetővé. Ez a dokumentáció meglehetősen terjedelmes, mert sok metódust kínálnak; íme a legfontosabb tulajdonságaik:
enumerate metódusuk, amely minden értékhez egy (i, val) tuple-t ad visszafilter metódusuk, amely egy closure segítségével dönti el, hogy kiadjon-e egy elemet az iterátorbólmap metódusuk, amely egy closure segítségével módosítja az iterátor elemeitMivel a függvényed bármilyen típusú iterátoron futhat, impl-t használ annak jelzésére, hogy ez egy trait-példány, nem pedig egy egyszerű elem. Hasonlóképpen a <Item=T> szintaxis csupán azt jelenti, hogy nem számít, milyen típusú elemet állít elő az iterátor; a függvényed bármely iterátor páros indexű elemeit elő tudja állítani.
fn evens<T>(iter: impl Iterator<Item=T>) -> impl Iterator<Item=T>
Példák:
let mut even_ints = evens(0_u8..);
assert_eq!(even_ints.next(), Some(0));
assert_eq!(even_ints.next(), Some(2));
assert_eq!(even_ints.next(), Some(4));
assert_eq!(even_ints.next(), Some(6));
let mut evens_from_odds = evens(1_i16..);
assert_eq!(evens_from_odds.next(), Some(1));
assert_eq!(evens_from_odds.next(), Some(3));
assert_eq!(evens_from_odds.next(), Some(5));
assert_eq!(evens_from_odds.next(), Some(7));
A könnyebb leképezés érdekében kapsz egy Position tuple-structot:
struct Position(i16, i16);
Implementálnod kell egy manhattan metódust a Position típuson, amely visszaadja az adott pozíció manhattan-távolságát az origótól (Position(0, 0)).
impl Position {
fn manhattan(&self) -> i16
}
Példa:
assert_eq!(Position(3, 4).manhattan(), 7);
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Rust nyelvet 99 feladat segítségével, valódi emberi mentorálással, mindez ingyen.