函数
约 716 字大约 2 分钟
2025-09-26
1. 基本使用
在 Rust 中声明一个函数使用关键字 fn,函数名使用 snake case 规范风格。编译器会在同一作用域内解析函数签名,因此函数可以写在调用处之后或调用之前
相关信息
程序入口默认是 fn main()
函数的基本使用
fn main() {
println!("Hello, world!");
another_function();
}
fn another_function() {
println!("Another function.");
}2. 参数
Rust 中的函数参数,必须声明参数类型。Rust 不支持参数默认值,也没有函数重载,需要用不同函数名或封装在枚举或 trait 中。
函数参数
fn main() {
print_labeled_measurement(5, 'h');
}
fn print_labeled_measurement(value: i32, unit_label: char) {
println!("The measurement is: {value}{unit_label}");
}2.1 参数模式匹配
函数参数能做模式匹配,如构元组或结构体,省去在函数体里再绑定局部变量的步骤
参数解构
fn print_point((x, y): (i32, i32)) {
println!("x = {x}, y = {y}");
}2.2 传递引用
通过引用或可变引用传参可以避免所有权移动
重要
使用可变引用时,调用侧要传入 &mut,并且绑定本身必须声明为 mut。
参数传引用
fn push_value(vec: &mut Vec<i32>, val: i32) {
vec.push(val);
}
fn main() {
let mut vec = vec![1, 2, 3];
push_value(&mut vec, 4);
}3. 返回值
函数有返回值时,需要在箭头 -> 后标明类型。通常直接让函数体最后一个表达式作为隐式返回值,如需提前结束则用 return
重要
隐式返回时表达式末尾不需要加 ;
函数返回值
fn five() -> i32 {
5
}
fn plus_one(num: i32) -> i32 {
num + 1
}
fn main() {
let x = five();
let plus = plus_one(5);
println!("The value of x is: {x}");
println!("The value of plus is: {plus}");
}3.1 表达式 vs 语句
带分号的是语句,不带分号的是表达式,尾部表达式会成为返回值。
分号对返回值的影响
fn add_one(x: i32) -> i32 {
x + 1 // 返回 x + 1
}
fn add_one_wrong(x: i32) -> i32 {
x + 1; // 变成语句,返回 (),会导致编译错误
x // 改成这样即可返回值
}3.2 默认返回值是 unit
未写 -> 时默认返回 (),它也是一个值,可以显式写出。
默认返回 unit
fn greet() {
println!("hi"); // 返回 ()
}
fn explicit_unit() -> () {
()
}3.3 返回多个值
可以用元组同时返回多个值。
返回元组
fn parts(x: i32) -> (i32, bool) {
(x, x > 0)
}
fn main() {
let (val, positive) = parts(-3);
println!("{val}, positive? {positive}");
}3.4 提前返回与表达式块
return 可以搭配表达式块,用于提前返回。
return 提前返回
fn safe_div(n: i32, d: i32) -> Option<i32> {
if d == 0 {
return None;
}
Some(n / d)
}3.5 永不返回的函数
发散类型 ! 表示函数永不返回,例如无限循环或直接 panic!。
发散函数
fn never_return() -> ! {
loop {
println!("looping forever");
}
}