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使用csv crate构建CSV文件读取器的全过程

    Rust使用csv crate构建CSV文件读取器的全过程

    这篇文章主要学习如何基于Rust使用csv这个crate构建一个CSV文件读取器的过程,学习了csv相关的用法以及一些往期学过的crate的复习,兼顾了实用性和Rust的学习,需要的朋友可以参考下
    2024-05-05
  • Rust自定义安装路径的详细图文教程

    Rust自定义安装路径的详细图文教程

    工欲善其事必先利其器,无论是对小白还是大神来说,想要学习 Rust 第一步那必须是 Rust 的环境配置,下面这篇文章主要给大家介绍了关于Rust自定义安装路径的详细图文教程,需要的朋友可以参考下
    2023-03-03
  • 如何基于Rust实现文本搜索minigrep

    如何基于Rust实现文本搜索minigrep

    这篇文章主要介绍了基于Rust实现的文本搜索minigrep,本次演示介绍针对原作者代码程序的查询逻辑做了一点点小的优化,原程序逻辑的查询是放在了程序运行的时候,逻辑修改后启动的时候可以添加参数,也可以启动后添加,需要的朋友可以参考下
    2024-08-08
  • Rust常用特型之Drop特型

    Rust常用特型之Drop特型

    本文主要介绍了Rust常用特型之Drop特型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Rust文本处理快速入门

    Rust文本处理快速入门

    编程过程中有许多类型的数据要处理,其中文本处理必不可少,本文主要介绍了Rust文本处理快速入门 ,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Rust中的panic定义及触发条件详解

    Rust中的panic定义及触发条件详解

    这篇文章主要为大家介绍了Rust中的panic定义及触发条件详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Rust中FFI编程知识点整理总结(推荐)

    Rust中FFI编程知识点整理总结(推荐)

    这篇文章主要介绍了Rust中FFI编程知识点整理总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Rust 枚举的使用学习笔记

    Rust 枚举的使用学习笔记

    Rust中的枚举是一种用户定义的类型,本文主要介绍了Rust枚举的使用,它们不仅仅用于表示几个固定的值,还可以包含函数和方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • rust 包模块组织结构详解

    rust 包模块组织结构详解

    RUST提供了一系列的功能来帮助我们管理代码,包括决定哪些细节是暴露的、哪些细节是私有的,以及不同的作用域的命名管理,这篇文章主要介绍了rust 包模块组织结构的相关知识,需要的朋友可以参考下
    2023-12-12
  • Rust调用函数操作符 . 和 :: 的区别详解

    Rust调用函数操作符 . 和 :: 的区别详解

    在Rust中,.和::操作符都可以用来调用方法,但它们的用法有所不同,所以本文就将详细的给大家介绍一下.和::操作符的区别,感兴趣的同学跟着小编一起来学习吧
    2023-07-07

最新评论