3.1 函数定义与调用
函数是组织代码的基本单元,它允许你将一段特定的逻辑封装起来,并在需要时重复使用。在 Rust 中,函数无处不在,从程序入口 main 函数到各种自定义功能,都离不开函数。
3.1.1 函数的基本定义
在 Rust 中,使用 fn 关键字来定义一个函数。函数名通常使用蛇形命名法(snake_case),即所有字母小写,单词之间用下划线分隔。
一个最简单的函数定义如下:
fn greet() {
println!("Hello, world!");
}
这个函数名为 greet,没有参数,也没有返回值。它的函数体包含在花括号 {} 中,执行一条打印语句。
3.1.2 函数的调用
定义好函数后,只需在函数名后加上一对圆括号 () 即可调用它。
fn main() {
println!("程序开始...");
greet(); // 调用 greet 函数
println!("程序结束...");
}
fn greet() {
println!("你好,Rust!");
}
注意: Rust 不关心函数定义在调用之前还是之后,只要它在当前作用域内可见即可。这与一些需要前向声明的语言(如 C/C++)不同。
3.1.3 函数体与表达式
Rust 是一个基于表达式的语言,这一点在函数体中体现得非常明显。
- 语句(Statements): 是执行一些操作但不返回值的指令。例如,
let x = 5;是一个语句,它不返回值。函数定义本身也是语句。 - 表达式(Expressions): 会计算并产生一个值。例如,
5 + 6是一个表达式,它计算并返回值11。x + y、函数调用、宏调用也都是表达式。
函数体的最后一行若没有分号,则它是一个表达式,其值会成为函数的返回值。这被称为“隐式返回”。
fn add(x: i32, y: i32) -> i32 {
x + y // 这是一个表达式,没有分号,它的值会被返回
}
fn main() {
let result = add(3, 5);
println!("3 + 5 = {}", result); // 输出: 3 + 5 = 8
}
你也可以使用 return 关键字进行显式返回,但 Rust 更推荐使用隐式返回,尤其是在函数末尾。
fn multiply(x: i32, y: i32) -> i32 {
return x * y; // 显式返回
}
3.1.4 函数签名与可见性
函数的签名包括函数名、参数列表和返回类型。默认情况下,函数是私有的,仅在定义它的模块内部可见。如果你希望函数对其他模块公开,需要使用 pub 关键字。
// 私有函数,只能在当前模块内调用
fn private_helper() {
println!("这是一个私有函数");
}
// 公有函数,可以被其他模块调用
pub fn public_function() {
println!("这是一个公有函数");
private_helper(); // 公有函数可以调用模块内的私有函数
}
3.1.5 一个完整的示例
下面是一个包含函数定义、调用、参数和返回值的完整示例:
// 定义一个函数,计算两个整数的和
fn sum(a: i32, b: i32) -> i32 {
a + b // 隐式返回
}
// 定义一个函数,打印欢迎信息,无返回值
fn welcome(name: &str) {
println!("欢迎你, {}!", name);
}
// 定义一个函数,判断一个数是否为偶数,返回布尔值
fn is_even(num: i32) -> bool {
num % 2 == 0 // 隐式返回布尔表达式的结果
}
fn main() {
// 调用 sum 函数
let total = sum(10, 20);
println!("总和是: {}", total); // 输出: 总和是: 30
// 调用 welcome 函数
welcome("张三"); // 输出: 欢迎你, 张三!
// 调用 is_even 函数
let number = 7;
if is_even(number) {
println!("{} 是偶数", number);
} else {
println!("{} 是奇数", number); // 输出: 7 是奇数
}
}
3.1.6 小结
- 使用
fn关键字定义函数。 - 函数名采用蛇形命名法(
snake_case)。 - 函数体由语句和表达式组成,最后一个表达式(不带分号)的值即为函数的返回值。
- 使用
->指定返回类型。 - 使用
pub关键字控制函数的可见性。 - 函数调用只需使用函数名加括号即可。
理解函数的基本定义和调用是掌握 Rust 编程的第一步,它为后续学习更复杂的函数特性(如参数传递、所有权、泛型等)奠定了基础。
