本文概述
匹配运算符允许我们将值与一系列模式进行比较, 并在找到匹配项时执行代码。模式可以是文字值, 变量名, 通配符和许多其他内容。
让我们通过一个简单的例子了解match运算符:
enum Computerlanguage
{
C, Cplus, Java, Csharp, }
fn language(language:Computerlanguage)
{
match language
{
Computerlanguage::C=> println!("C language"), Computerlanguage::Cplus=> println!("C++ language"), Computerlanguage::Java=> println!("Java language"), Computerlanguage::Csharp=> println!("C# language"), }
}
fn main()
{
language(Computerlanguage::C);
language(Computerlanguage::Cplus);
language(Computerlanguage::Java);
language(Computerlanguage::Csharp);
}
输出
C language
C++ language
Java language
C# language
在上面的示例中, Computerlanguage是一种自定义数据类型, 由四个变体组成, 分别是C, Cplus, Java和Csharp。 match运算符将语言的值与match运算符块中给定的表达式进行匹配。
与Option <T>匹配
在某些情况下要获取T的内部值时, 将使用Option <T>。
Option <T>由两个变体组成:
- 无:表示失败或价值不足。
- Some(value):这是一个用T包裹值的元组结构。
让我们通过一个例子来理解:
fn main()
{
even_number(2);
even_number(3);
}
fn even_number(n:i32)
{
let num=n;
match checked_even(n)
{
None=>println!("None"), Some(n)=>
{
if n==0
{
println!("{} is a even number", num);
}
else
{
println!("{} is a odd number", num);
}}, }
}
fn checked_even(number:i32)->Option<i32>
{
Some(number%2)
}
输出
2 is a even number
3 is a odd number
比赛内容详尽
在Rust中, 匹配是详尽无遗的, 也就是说, 我们应该尽一切可能的情况使代码有效。假设我们忘记编写None案例, 那么Rust编译器将显示”模式’None’未覆盖”的错误。
让我们通过一个例子来理解这种情况:
fn main()
{
Some(5);
}
fn Value(n:Option<i32>)
{
match n
{
Some(n)=>println!("{}is a Number", n), }
}
输出