Rust 函数定义、参数类型与表达式返回值详解
本文详细解析 Rust 中的函数编写规范。内容涵盖函数定义的 snake_case 命名、强类型参数校验机制,并深入区分语句与表达式的差异。重点说明如何通过消除尾部分号来实现隐式返回值,以及利用 Tuple 结构体处理多个返回值的操作技巧。
函数基础定义
Rust 语言的函数采用 snake_case(小写加下划线)作为命名规范。定义函数时使用 fn 关键字,主体由花括号包裹。main 函数作为程序的入口点,负责承载业务逻辑的启动。
在同一个作用域(scope)内调用其他包下的函数时,需确保该函数可见。函数调用的顺序不依赖其在文件中的排列位置,编译器会进行符号解析。
fn main() {
println!("Hello, world!");
another_function();
}
fn another_function() {
println!("Another function.");
}
参数传递与类型推断
Rust 的函数参数支持自定义类型,且编译器不具备自动推断入参类型的能力。必须在参数名后使用冒号和空格明确标注数据类型,例如 x: i32。这一设计旨在提高编译错误信息的精准度。
当需要传递多个参数时,可使用逗号分隔不同类型:
fn print_labeled_measurement(value: i32, unit_label: char) {
println!("The measurement is: {value}{unit_label}");
}
fn main() {
print_labeled_measurement(5, 'h');
}
语句与表达式的执行差异
Rust 是一门基于表达式的语言,理解“语句”与“表达式”的区别至关重要:
- 语句 (Statements):仅执行动作(如变量绑定),不产生返回值。例如:
let y = 6;。 - 表达式 (Expressions):计算过程并生成一个确定的值,可作为赋值的一部分。例如:
6或x + 1。
由于表达式具备返回值,而语句没有,因此不能将语句作为表达式的一部分。这也意味着 Rust 不支持类似 C/C++/Java 的链式赋值语法。
第1步:确认表达式无尾部分号
目的:确保函数能正确返回所需的类型值。 在 Rust 函数体中,最后一行若包含分号,会被视为语句而非表达式,导致返回值缺失或变成空元组。
// 正确写法:隐式返回整数 6
fn add_one(x: i32) -> i32 {
x + 1
}
// 错误写法:末尾的分号将其转为语句,函数实际返回值为 ()
fn broken_add_one(x: i32) -> i32 {
x + 1;
}
上述错误会导致编译阶段出现 mismatched types(类型不匹配)报错,因为函数声明了返回 i32,但实际返回的是空元组 ()。
多返回值处理
Rust 并不支持 Go 语言风格的命名多返回值,而是通过返回 Tuple(元组)来实现同一函数传出多个结果。返回时需要完整保留圆括号。
// 返回类型为 (i32, i32)
fn swap(x: i32, y: i32) -> (i32, i32) {
(y, x)
}
fn main() {
// 解构获取值
let (a, b) = swap(10, 20);
println!("{} {}", a, b);
}
注释编写规范
在 Rust 源码中添加注释主要分为以下两种:
- 普通注释:使用双斜杠
//。适用于单行或多行的内部逻辑解释,不会生成外部文档。 - 文档注释:使用三斜杠
///写在函数上方。这种格式允许工具为公有函数自动生成 HTML API 文档,通常建议包含示例代码块。
// 普通行注释
let lucky_number = 7;
/// 功能描述...
///
/// # Examples
/// ```
/// let result = my_func(5);
/// assert_eq!(result, 6);
/// ```
pub fn add_one(x: i32) -> i32 {
x + 1
}
以上就是Rust 函数定义、参数类型与表达式返回值详解的详细内容,更多关于Rust 基础教程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









