A függvények olyan kódrészek, amelyek egy vagy több utasítást vagy kifejezést tartalmaznak. A függvény opcionálisan visszaadhat egy értéket.
A Rust stílusa szerint a függvényneveknél snake case-t használunk, és a függvénydefiníciót az fn kulcsszó vezeti be. Például
fn do_nothing() {}
A zárójelek nulla vagy több paramétert fognak közre, amelyeket vessző választ el. A paraméter egy adott típusú értékhez kapcsolódó kötés, amelyet a függvénynek adunk át. Még ha nincsenek is paraméterek, a zárójelek akkor is kötelezőek a függvénydefinícióban. A paraméternek átadott tényleges értéket argumentumnak nevezzük.
A paraméterek és a visszatérési érték együttesét a függvény szignatúrájának nevezzük. A függvény szignatúrájában minden paraméternél fel kell tüntetni a típust.
A kapcsos zárójelek a függvény törzsét fogják közre: annak utasításait és kifejezéseit. Még ha a függvény nem tartalmaz is utasításokat vagy kifejezéseket, a kapcsos zárójelek akkor is kötelezőek a függvénydefinícióhoz.
A következő példában a függvény egy i32 típusú paramétert kap, a value névhez köti, majd kiírja.
fn print_integer(value: i32) {
println!("{value:?}");
}
Figyeld meg a paraméter definícióját. Minden paraméter a name: Type formátumban van megadva.
A függvény értéket is visszaadhat. Alapértelmezés szerint az utolsó kifejezés értéke lesz a visszatérési érték.
A következő példában a függvénynek egy i32 paramétere van, és annak kétszeresét adja vissza.
fn double_integer(value: i32) -> i32 {
value * 2
}
A -> i32 azt jelzi, hogy a függvény egy i32-t ad vissza. A paraméterekkel ellentétben a visszatérési értéknek nincs neve.
A return kulcsszóval idő előtt is kiléphetsz a függvényből, így:
fn long_function() -> i32 {
let some_condition = false;
// code snipped
if (some_condition) {
return 0;
}
// more code snipped
42
}
A const fn segítségével konstans függvényt definiálhatsz, amelyet fordítási időben is ki lehet értékelni.
const fn compute_data_checksum() -> u128 {
const DATA: &[u8] = include_bytes!("my_big_data_file");
// checksum implementation is left as an exercise for the reader
}
/// This checksum is used to validate that the user has not tampered with proprietary configuration.
pub const DATA_CHECKSUM: u128 = compute_data_checksum();
Mivel a konstans függvényeket fordítási időben is ki lehet értékelni, néhány olyan megkötés vonatkozik rájuk, ami a normál függvényekre nem.
A const fn például csak más, szintén const-ként megjelölt függvényeket hívhat meg. Ha nem tartod be ezt a megkötést, fordítási hibát
kapsz.
const fn multiply_integer(value: i32) -> i32 {
use std::time::SystemTime;
if SystemTime::now().elapsed().unwrap().as_nanos() == 0 { // this line errors
value * 2
} else {
value * 3
}
}
Léteznek névtelen függvények is; ezekkel a closures témakör foglalkozik.