函数是一段代码,其中包含一个或多个语句或表达式。函数可以选择性地返回一个值。
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主题中介绍。