Rust中@符号有什么用?

在 Rust 中,@符号用于模式匹配,将变量绑定到正在匹配的值。好处是可重用包含在匹配模式中同时又使用该值的变量。这种用法是 Rust 所独有的

例如,如果您有一个带有变量的枚举,则可以使用该符号将变量绑定到匹配语句中的值,如下所示:@StudentJunior@Junior

enum Student {
    Junior(i32),
    Senior(i32),
}

let student = Student::Junior(1);

match student {
    Student::Junior(age @ _) => println!("Junior's age is {}", age),
    _ => (),
}

在本例中,age @ _ 将变量 age 与 Junior 变体中的值绑定,使其可以在匹配臂中使用。在匹配保护中也可以使用 @ 符号来测试一个值,并将其保存在一个模式内的变量中

什么是模式匹配?
模式匹配是编程语言中使用的一种技术,用于检查给定的标记序列是否存在某种模式的组成部分。它是一种基于数据结构做出决策的机制。模式匹配允许您定义一组模式并为每个模式指定操作,从而使代码不仅更具可读性,而且更易于维护且不易出错。它是许多编程语言的基本功能,例如 Rust、Haskell、Scala 和包括 OCaml 在内的 ML 语言。模式匹配的目的是以非常方便、紧凑的语法分解和导航数据结构,并且它使编译器能够检查代码的逻辑。

它是一个强大的工具,可以简化代码并提高可读性,使其更加不言自明。模式匹配不仅限于函数式编程语言,也用于命令式编程语言

Rust的match
Rust 通过match关键字提供模式匹配,可以像 C 一样使用switch。评估第一个match并且必须覆盖所有可能的值。

fn main() {
    let number = 13;
    // TODO ^ Try different values for `number`

    println!(
"Tell me about {}", number);
    match number {
       
//匹配单个值
        1 => println!(
"One!"),
       
// 匹配多个值
        2 | 3 | 5 | 7 | 11 => println!(
"This is a prime"),
       
// TODO ^ Try adding 13 to the list of prime values
       
// 匹配包含范围
        13..=19 => println!(
"A teen"),
       
// 处理其余案件
        _ => println!(
"Ain't special"),
       
// TODO ^ Try commenting out this catch-all arm
    }

    let boolean = true;
   
// Match is an expression too
    let binary = match boolean {
       
// 匹配臂必须涵盖所有可能的值
        false => 0,
        true => 1,
       
// TODO ^ Try commenting out one of these arms
    };

    println!(
"{} -> {}", boolean, binary);
}


Rust 中@符号有两种用法:

  • 用于标识元组字段的名称。
  • 用于标识宏的参数。

元组字段名称
在 Rust 中,元组可以包含多个元素,每个元素都可以有自己的名称。要为元组字段指定名称,可以使用@符号。例如:

Rust

struct Point {
    x: i32,
    @y: i32,
}

fn main() {
    let point = Point {
        x: 10,
        @y: 20,
    };

    println!("{}", point.x); // 10
    println!(
"{}", point.@y); // 20
}

在上面代码中,元组 Point 有两个字段,x 和 y。字段 y 使用了@符号来指定名称。

宏参数
在 Rust 中,宏可以使用参数来接收输入。要为宏参数指定名称,可以使用@符号。例如:

macro_rules! my_macro {
    ($x:expr @ $y:expr) => {
        println!("x = {}, y = {}", $x, $y);
    }
}

fn main() {
    my_macro!(10 @ 20);
}

在上面代码中,宏 my_macro 有两个参数,x 和 y。参数 y 使用了@符号来指定名称。
在 Rust 中,@符号通常用于提高代码的可读性。例如,使用@符号来标识元组字段名称,可以使代码更容易理解。

注意:在早期版本的Rust中,@符号用于创建堆上分配的数据,如堆分配的字符串或堆分配的盒子(Box)。这种符号在过去的Rust版本中更为常见,但在当前版本中已经被废弃,而使用Box和String类型更为直观和规范。