A Rust programozási nyelv

Utasítások, vezérlési szerkezetek

Elágazás

Már láttuk az if elágazást, a feltételt nem kell zárójelbe tenni, a törzsét blokként kell megadni, lehet opcionálisan egy else ága és akárhány else if. A feltételének kötelező bool típusúnak lennie, nincs konverzió más típusról. Ha egy ágban a blokknak van értéke, akkor minden ágban kell lennie és ugyanolyan típusú értéknek.

fn signum(x: int) -> int { if x < 0 { -1 } else if x > 0 { 1 } else { 0 } }

Mintaillesztés

A match kontrukció a C-beli switch általánosított és letisztult változata. Megkell adni hozzá egy értéket és ágakat, az ágaknak van egy címkéje amit illeszt majd az értékhez és egy törzse amit végre hajt ha illeszkedik.

Különbség a C-hez képest, hogy ha egy ág feltétele teljesül és végrehajtódik a törzse akkor a vezérlés nem „folyik” tovább a következő ágra, hanem a match blokk végére megy, nem kell explicit break-et megadni minden ág törzsében.

match my_number { 0 => println("zero"), 1 | 2 => println("one or two"), 3..10 => println("three to ten"), _ => println("something else") }

Az ágak egy mintával kezdődnek, majd => majd egy kifejezés, ami lehet blokk is. Több mintára is illeszhet egy ág, kombinálni lehet a | operátorral, numerikus tartományok megadása is lehetséges M..N, illetve a default ág megfelel a _-ra való illesztés, ez mindenre illeszkedik. Az ágaknak minden lehetséges esetet lekell fedniük.

use std::f64; use std::num::atan; fn angle(vector: (f64, f64)) -> f64 { let pi = f64::consts::PI; match vector { (0.0, y) if y < 0.0 => 1.5 * pi, (0.0, y) => 0.5 * pi, (x, y) => atan(y / x) } }

Továbbá még az ágaknél megadhatóak őrfeltételek: if kifejezés. Ezeket patternguard-oknak nevezik. A kifejezés értéke bool kell legyen. A match szerkezet használható let változómegadásban is, de ekkor olyant kell megadni, aminél biztos tud illeszteni.

let (a, b) = get_tuple_of_two_ints();

Ciklusok

While ciklus: iterál amíg a feltétel igaz, a feltétel bool típusú. A törzsében adható break, ami megszakítja a ciklus végrehajtását és continue, ami az aktuális iterációt szakítja meg, és ugrik a következő kezdetére, a feltétel kiértékelésre(mint C++-ban).

let mut cake_amount = 8; while cake_amount > 0 { cake_amount -= 1; }

Végtelen ciklus a loop kulcsszóval adhatunk, vagy a while true-val. Azonban ezekből is kilehet ugrania break kulcsszóval.

let mut x = 5u; loop { x += x - 3; if x % 5 == 0 { break; } println(x.to_str()); }

Számlálós ciklus: intervallumon vagy iterátorral:

for n in range(0, 5) { println!("{}", n); } let xs = [2u, 3, 5, 7, 11, 13, 17]; for x in xs.iter() {     println(x.to_str()) }