函式是一段程式碼,內含一個或多個敘述或運算式。函式可以選擇性地回傳值。
Rust 的風格是函式名稱使用蛇形命名法,並在函式定義前加上 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 主題中介紹。