📜  Rust 中的函数(1)

📅  最后修改于: 2023-12-03 15:04:57.847000             🧑  作者: Mango

Rust 中的函数

在 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_alicehello_bob,并打印输出。

Iterator 和高阶函数

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_numsfiltered_nums,以及一个整数 sum,最后打印输出。其中 map() 函数将迭代器中的元素都乘以 2,filter() 函数将迭代器中的偶数过滤出来并加 1,fold() 函数将迭代器中的所有元素累加起来。

总结

本文介绍了 Rust 中的函数,包括函数参数、返回值、匿名函数、闭包以及高阶函数。函数是 Rust 的基本语言结构之一,也是构建复杂应用程序的核心组件。熟练掌握 Rust 中函数的使用,对于开发高质量的 Rust 应用程序非常重要。