在 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 <code>number</code>
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类型更为直观和规范。