Rust 中的绑定与解构

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,我们将探索 Rust 中的绑定概念,它允许间接访问变量,并能够在不重新绑定的情况下分支并使用该变量。match 语句中的 @ 符号用于将值绑定到名称。文中提供了示例,包括如何将值绑定到特定范围,以及如何“解构”像 Option 这样的 enum 变体。

注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用 main.rs,并通过 rustc main.rs &&./main 进行编译和运行。

绑定

间接访问变量会导致在不重新绑定的情况下无法对该变量进行分支和使用。match 提供了 @ 符号用于将值绑定到名称:

// 一个返回 `u32` 类型的函数 `age`。
fn age() -> u32 {
    15
}

fn main() {
    println!("告诉我你是什么类型的人");

    match age() {
        0             => println!("我还没有庆祝过我的第一个生日"),
        // 可以直接匹配 1..=12,但这样孩子的年龄该怎么表示呢?
        // 相反,将 1..=12 的序列绑定到 `n`。现在就可以报告年龄了。
        n @ 1 ..= 12 => println!("我是一个 {} 岁的孩子", n),
        n @ 13..= 19 => println!("我是一个 {} 岁的青少年", n),
        // 没有绑定任何值。返回结果。
        n             => println!("我是一个 {} 岁的老人", n),
    }
}

你还可以使用绑定来“解构” enum 变体,比如 Option

fn some_number() -> Option<u32> {
    Some(42)
}

fn main() {
    match some_number() {
        // 得到了 `Some` 变体,如果其值(绑定到 `n`)等于 42,则进行匹配。
        Some(n @ 42) => println!("答案是:{}!", n),
        // 匹配任何其他数字。
        Some(n)      => println!("没什么意思... {}", n),
        // 匹配任何其他情况(`None` 变体)。
        _            => (),
    }
}

总结

恭喜你!你已经完成了绑定实验。你可以在 LabEx 中练习更多实验来提升你的技能。