📅  最后修改于: 2023-12-03 15:04:57.847000             🧑  作者: Mango
在 Rust 中,函数是一段可重用的代码块,可以接收输入参数并返回一个结果。函数的定义以 fn
关键字开始,其格式如下:
fn function_name(parameter1: Type1, parameter2: Type2) -> ReturnType {
// 函数体
// 可以使用 return 关键字返回一个值
}
参数和返回值都有类型声明,但 Rust 的静态类型检查器往往能够自动推导类型,因此可以省略一些类型声明。
下面介绍 Rust 中函数的一些常用特性。
Rust 中的函数参数可以有默认值,也支持可变参数。代码示例:
fn greet(name: &str, greeting: &str) {
println!("{}, {}!", greeting, name);
}
fn greet_with_default(name: &str, greeting: &str) {
if greeting.is_empty() {
println!("Hello, {}!", name);
} else {
greet(name, greeting);
}
}
fn greet_with_variadic(names: &[&str], greeting: &str) {
for name in names {
greet(name, greeting);
}
}
fn main() {
greet("Alice", "Good morning");
greet_with_default("Bob", "");
greet_with_variadic(&["Charlie", "Dave"], "Hi");
}
函数 greet()
接收两个 &str
类型的参数,分别代表名字和问候语。函数 greet_with_default()
也接受两个参数,但第二个参数有默认值,如果不传递就使用默认值。函数 greet_with_variadic()
接收一个 &[&str]
类型的参数和一个字符串参数,前者代表多个名字,后者代表问候语。
函数的返回值可以是任意类型,包括没有类型的 ()
(即空元组)。Rust 通过函数体中的最后一行代码的结果来确定函数的返回值。代码示例:
fn get_max(num1: i32, num2: i32) -> i32 {
if num1 > num2 {
num1
} else {
num2
}
}
fn do_nothing() {}
fn main() {
let max_num = get_max(10, 20);
println!("The maximum number is {}", max_num);
let result = do_nothing();
println!("The result of do_nothing() is {:?}", result);
}
函数 get_max()
接收两个 i32
类型的参数,返回其中的最大值。函数 do_nothing()
没有参数也没有返回值,其返回类型是 ()
。在 main()
函数中,我们先使用 get_max()
函数计算出最大值,并打印输出。接着调用 do_nothing()
函数,并将其返回值赋值给 result
,最后打印输出 result
。
Rust 中的函数也可以是匿名的,我们称之为闭包(closure)。闭包可以捕获当前上下文中的变量,并有灵活的参数形式。代码示例:
fn main() {
let greeting = "Hello";
let add_suffix = |name: &str| {
let full_name = format!("{} {}", name, "Rustacean");
format!("{}, {}!", greeting, full_name)
};
let hello_alice = add_suffix("Alice");
let hello_bob = add_suffix("Bob");
println!("{}", hello_alice);
println!("{}", hello_bob);
}
在 main()
函数里定义了一个字符串变量 greeting
和一个匿名函数 add_suffix
。函数体内使用了 greeting
变量和传入的 name
参数,返回一个字符串。最后通过两次调用 add_suffix()
函数得到字符串 hello_alice
和 hello_bob
,并打印输出。
Rust 中的 Iterator 提供了一组高度抽象的迭代器接口,也支持对迭代器进行操作的高阶函数,如 map()
、filter()
、fold()
等。这些函数可以被应用于各种不同的迭代器类型,包括数组、向量、哈希表等。代码示例:
fn main() {
let nums = [1, 2, 3, 4, 5];
let doubled_nums: Vec<i32> = nums.iter().map(|&x| x * 2).collect();
println!("{:?}", doubled_nums);
let filtered_nums: Vec<i32> = nums.iter().filter(|&x| x % 2 == 0).map(|&x| x + 1).collect();
println!("{:?}", filtered_nums);
let sum = nums.iter().fold(0, |acc, &x| acc + x);
println!("The sum is {}", sum);
}
首先定义了一个整型数组 nums
,接着使用 iter()
方法获得一个迭代器,然后分别对其应用 map()
、filter()
、fold()
函数,得到另外两个向量 doubled_nums
和 filtered_nums
,以及一个整数 sum
,最后打印输出。其中 map()
函数将迭代器中的元素都乘以 2,filter()
函数将迭代器中的偶数过滤出来并加 1,fold()
函数将迭代器中的所有元素累加起来。
本文介绍了 Rust 中的函数,包括函数参数、返回值、匿名函数、闭包以及高阶函数。函数是 Rust 的基本语言结构之一,也是构建复杂应用程序的核心组件。熟练掌握 Rust 中函数的使用,对于开发高质量的 Rust 应用程序非常重要。