Οι συναρτήσεις είναι σώματα κώδικα που περιέχουν μία ή περισσότερες εντολές ή εκφράσεις. Μια συνάρτηση μπορεί προαιρετικά να επιστρέψει μια τιμή.
Το στυλ της Rust είναι να χρησιμοποιεί snake case για το όνομα μιας συνάρτησης, το οποίο στον ορισμό μιας συνάρτησης προτάσσεται από τη λέξη-κλειδί fn. Για παράδειγμα
fn do_nothing() {}
Οι παρενθέσεις περικλείουν μηδέν ή περισσότερες παραμέτρους, χωρισμένες με κόμματα. Μια παράμετρος είναι μια δέσμευση σε μια τιμή συγκεκριμένου τύπου, η οποία περνιέται στη συνάρτηση. Ακόμα κι αν δεν υπάρχουν παράμετροι, οι παρενθέσεις εξακολουθούν να απαιτούνται στον ορισμό της συνάρτησης. Η πραγματική τιμή που περνάει σε μια παράμετρο ονομάζεται όρισμα.
Ο συνδυασμός παραμέτρων και τιμής επιστροφής είναι γνωστός ως υπογραφή της συνάρτησης. Η υπογραφή μιας συνάρτησης απαιτεί κάθε παράμετρος να έχει δηλωμένο τον τύπο της.
Τα άγκιστρα περικλείουν το σώμα της συνάρτησης: τις εντολές και τις εκφράσεις της. Ακόμα κι αν η συνάρτηση δεν περιέχει εντολές ή εκφράσεις, τα άγκιστρα εξακολουθούν να απαιτούνται για τον ορισμό της συνάρτησης.
Στο παρακάτω παράδειγμα, η συνάρτηση δέχεται μία παράμετρο τύπου i32, τη δεσμεύει στο όνομα value και την εκτυπώνει.
fn print_integer(value: i32) {
println!("{value:?}");
}
Πρόσεξε τον ορισμό της παραμέτρου. Κάθε παράμετρος ορίζεται στη μορφή name: Type.
Μια συνάρτηση μπορεί επίσης να επιστρέψει μια τιμή. Από προεπιλογή, επιστρέφεται το αποτέλεσμα της τελικής έκφρασης. Στο παρακάτω παράδειγμα, η συνάρτηση έχει μία παράμετρο i32 και επιστρέφει το διπλάσιό της.
fn double_integer(value: i32) -> i32 {
value * 2
}
Το -> i32 δείχνει ότι η συνάρτηση επιστρέφει ένα i32. Σε αντίθεση με τις παραμέτρους, η τιμή που επιστρέφεται δεν έχει όνομα.
Είναι δυνατόν να βγεις από μια συνάρτηση πρόωρα με τη λέξη-κλειδί return, ως εξής:
fn long_function() -> i32 {
let some_condition = false;
// code snipped
if (some_condition) {
return 0;
}
// more code snipped
42
}
Το const fn χρησιμοποιείται για να ορίσει μια σταθερή συνάρτηση, η οποία μπορεί να υπολογιστεί κατά τη μεταγλώττιση.
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();
Επειδή οι σταθερές συναρτήσεις μπορεί να υπολογιστούν κατά τη μεταγλώττιση, έχουν κάποιους περιορισμούς που δεν έχουν οι κανονικές συναρτήσεις. Συγκεκριμένα, ένα const fn μπορεί να καλέσει μόνο άλλες συναρτήσεις που είναι επίσης σημειωμένες ως const. Η μη τήρηση αυτού του περιορισμού θα έχει ως αποτέλεσμα σφάλμα μεταγλώττισης.
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
}
}
Υπάρχουν ανώνυμες συναρτήσεις, οι οποίες καλύπτονται στο θέμα closures.