rust中的match表达式使用详解

 更新时间:2023年08月01日 10:23:42   作者:每天都要加油呀!  
在rust中提供了一个极为强大的控制流运算符match,这篇文章主要介绍了rust中的match表达式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

match使用

在rust中提供了一个极为强大的控制流运算符match

  • match允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码
  • 这些模式可以是子面值变量名通配符等等

来个例子

fn main() {
    println!("penny {}", value_in_cents(Coin::Penny)) // penny 1
}
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}
fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter => {
            println!("多行的情况需要加上花括号");
            25
        },
    }
}

绑定值的模式

匹配的分支可以绑定到被匹配对象的部分值,因此我们可以从enum变体中获取值

fn main() {
    println!("penny {}", value_in_cents(Coin::Quarter(UsState::Alabama))) // State quarter from Alabama\n penny 25 
}
#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
}
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}
fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        // 绑定值的模式匹配
        Coin::Quarter(state) => {
            println!("State quarter from {:?}", state);
            25
        },
    }
}

在rust的match匹配中,必须要穷举所有的变体

但是如果match要匹配的变体太多了,我们不想处理那么多该怎么办呢?

  • 可以使用通配符_来替代其余没列出的值
fn main() {
    let v = 0u8;
    match v {
        1 => println!("one"),
        2 => println!("two"),
        3 => println!("three"),
        // 其他的不想匹配了,可以使用`_`替代,下换线通配符只能放到最后一行
        _ => println!("other")
    }
}

match语法糖【if let】

上述的例子可以使用if let控制流进行改写

fn main() {
    let v = 0u8;
    match v {
        1 => println!("one"),
        2 => println!("two"),
        3 => println!("three"),
        // 其他的不想匹配了,可以使用`_`替代,下换线通配符只能放到最后一行
        _ => println!("other"),
    }
    // 可以使用let进行简写
    if let 3 = v {
        println!("three");
    } else {
        println!("other")
    }
}

小结一下if let的作用

  • 处理只关心一种匹配二忽略其他匹配的情况
  • 更少的代码、更少的缩进、更少的模板代码
  • 放弃了穷举的可能
  • 我们可以把if let当做是match的语法糖

匹配Option

fn main() {
    let five = Some(5);
    let six = plus_one(five);
    let none = plus_one(None);
    // 使用模式匹配和Option可以避免其他语言出现NPE的问题
    match six {
        Some(value) => println!("six: {}", value),
        None => println!("six: None"),
    }
    match none {
        Some(value) => println!("none: {}", value),
        None => println!("none: None"),
    }
}
fn plus_one(x: Option<i32>) -> Option<i32> {
    match x {
        None => None,
        Some(i) => Some(i + 1)
    }
}

到此这篇关于rust中的 match表达式的文章就介绍到这了,更多相关rust match表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Rust语言数据类型的具体使用

    Rust语言数据类型的具体使用

    在Rust中,每个值都有一个明确的数据类型,本文主要介绍了Rust语言数据类型的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • Rust编写自动化测试实例权威指南

    Rust编写自动化测试实例权威指南

    这篇文章主要为大家介绍了Rust编写自动化测试实例权威指南详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Rust 连接 SQLite 数据库的过程解析

    Rust 连接 SQLite 数据库的过程解析

    本文通过一个例子给大家介绍了Rust 连接 SQLite 数据库的详细过程,我使用rusqlite这个crate,对Rust 连接 SQLite 数据库相关知识感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • Rust 语言的全链路追踪库 tracing使用方法

    Rust 语言的全链路追踪库 tracing使用方法

    这篇文章主要介绍了Rust 语言的全链路追踪库 tracing,接下来就以 tracing 为例,介绍一下trace 的核心概念以及使用方法,需要的朋友可以参考下
    2022-12-12
  • 从零开始使用Rust编写nginx(TLS证书快过期了)

    从零开始使用Rust编写nginx(TLS证书快过期了)

    wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,本文给大家介绍从零开始使用Rust编写nginx(TLS证书快过期了),感兴趣的朋友一起看看吧
    2024-03-03
  • Rust调用Windows API 如何获取正在运行的全部进程信息

    Rust调用Windows API 如何获取正在运行的全部进程信息

    本文介绍了如何使用Rust调用WindowsAPI获取正在运行的全部进程信息,通过引入winapi依赖并添加相应的features,可以实现对不同API集的调用,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • 详解rust 自动化测试、迭代器与闭包、智能指针、无畏并发

    详解rust 自动化测试、迭代器与闭包、智能指针、无畏并发

    这篇文章主要介绍了rust 自动化测试、迭代器与闭包、智能指针、无畏并发,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • Rust cargo 命令行工具使用示例教程

    Rust cargo 命令行工具使用示例教程

    cargo 是 Rust 的构建系统和包管理器,负责创建项目、编译代码、管理依赖、运行测试等,是日常开发中最常用的工具,这篇文章主要介绍了Rust cargo 命令行工具使用教程,需要的朋友可以参考下
    2025-04-04
  • 详解Rust调用tree-sitter支持自定义语言解析

    详解Rust调用tree-sitter支持自定义语言解析

    使用Rust语言结合tree-sitter库解析自定义语言需要定义语法、生成C解析器,并在Rust项目中集成,具体步骤包括创建grammar.js定义语法,使用tree-sitter-cli工具生成C解析器,以及在Rust项目中编写代码调用解析器,这一过程涉及到对tree-sitter的深入理解和Rust语言的应用技巧
    2024-09-09
  • rust闭包的使用

    rust闭包的使用

    闭包在Rust中是非常强大的功能,允许你编写更灵活和表达性的代码,本文主要介绍了rust闭包的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12

最新评论