📜  Rust – 匹配运算符(1)

📅  最后修改于: 2023-12-03 15:04:57.754000             🧑  作者: Mango

Rust – 匹配运算符

在 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。这个模式将 nameage 字段绑定到 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::PendingState::ApprovedState::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 中最常用的控制流构造之一。