📅  最后修改于: 2023-12-03 15:04:57.754000             🧑  作者: Mango
在 Rust 中,match
是一个非常强大的控制流构造。匹配运算符可以用于匹配一个值,然后基于其内容选择不同的代码路径。这个功能在许多情况下都非常有用,包括错误处理、解析命令行参数、以及处理类型转换。
下面是一个简单的例子,演示了使用 match
语句进行匹配:
let fruit = "apple";
match fruit {
"apple" => println!("I like apples!"),
"banana" => println!("I don't like bananas."),
_ => println!("I don't like that fruit.")
}
这个 match
语句匹配 fruit
变量的值,然后根据匹配的结果打印不同的消息。如果值是 "apple",则打印 "I like apples!";如果值是 "banana",则打印 "I don't like bananas.";否则,打印 "I don't like that fruit."。
这个例子中使用了 _
来匹配所有其它值。这个符号表示“任意值”,在 match
语句中非常有用。如果没有 _
,那么代码就必须匹配完所有可能的值,这可能会很麻烦。
Rust 中的匹配模式非常灵活,可以匹配字符串、数字、结构体、枚举、元组等各种类型的值。下面是一些常见的匹配模式:
常量是匹配模式的一种常见形式。可以匹配 bool、数字或字符串等常量。例如:
let num = 5;
match num {
0 => println!("The number is zero."),
1 => println!("The number is one."),
_ => println!("The number is something else.")
}
还可以使用范围来进行匹配。范围由两个值组成,用 ..
连接,表示从左侧的值到右侧的值之间的所有可能的值。例如:
let age = 20;
match age {
0..=17 => println!("You are not old enough to vote."),
18..=64 => println!("You can vote."),
65..=120 => println!("You are too old to vote."),
_ => println!("You are not human!")
}
结构体可以具有各种字段,匹配时需要匹配每个字段的值。使用结构体的名称来匹配整个结构体。例如:
struct Person {
name: String,
age: u8,
}
let me = Person {
name: "Alice".to_string(),
age: 30,
};
match me {
Person { name, age } => {
println!("Name: {}", name);
println!("Age: {}", age);
},
}
在这个例子中,使用 Person { name, age }
来匹配结构体 me
。这个模式将 name
和 age
字段绑定到 Person
实例中的值。
枚举是另一种可以进行匹配的数据类型。在 Rust 中,枚举的每个可能值称为一个变体,可以使用 match
语句来匹配变体。例如:
enum State {
Pending,
Approved,
Denied,
}
let status = State::Pending;
match status {
State::Pending => println!("Your request is pending."),
State::Approved => println!("Your request has been approved."),
State::Denied => println!("Your request has been denied."),
}
在这个例子中,使用 State::Pending
、State::Approved
和 State::Denied
来匹配枚举类型 State
的值。
元组是可以合并多个值的数据类型。可以使用元组来匹配多个值。例如:
let pair = (5, true);
match pair {
(0, true) => println!("The pair is (0, true)"),
(x, true) => println!("The first value is {} and the second value is true", x),
(0, y) => println!("The pair is (0, {})", y),
_ => println!("The pair is something else."),
}
在这个例子中,使用 (0, true)
、(x, true)
和 (0, y)
来匹配元组类型 pair
的值。在匹配 (x, true)
时将 x
绑定到元组的第一个值。
匹配语句的返回值是匹配的结果。如果匹配成功,则返回匹配对应的代码。例如:
let num = 5;
let result = match num {
0 => "The number is zero.",
1 => "The number is one.",
_ => "The number is something else."
};
println!("{}", result);
在这个例子中,使用 match
语句来匹配 num
变量的值,并将匹配的结果赋值给 result
变量。在这里,匹配的结果是字符串类型的值。
Rust 中的 match
语句非常强大,可以用于各种不同类型的值的匹配,包括常量、范围、结构体、枚举、元组等。这种灵活性使其成为 Rust 中最常用的控制流构造之一。