Rust控制流运算符match的用法详解

 更新时间:2024年01月28日 10:40:46   作者:qq5551230  
match 是Rust中一个极为强大的控制流运算符,用于模式匹配和控制流的选择,它允许将一个值与一系列的模式相比较,根据匹配的模式执行相应代码,本文给大家详细介绍了Rust控制流运算符match的用法,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

概述

match 是Rust中一个极为强大的控制流运算符,用于模式匹配和控制流的选择。它允许将一个值与一系列的模式相比较,根据匹配的模式执行相应代码。模式可由字面量、变量、通配符和许多其他内容构成。

模式由以下元素(的一些组合)组成:

  • 字面量
  • 解构的数组
  • 枚举类型
  • 结构体
  • 处理条件表达式
  • 通配符
  • 占位符

我们可以把match表达式想象成某种硬币分类器:硬币滑入有着不同大小孔洞的轨道,每个硬币都会掉入符合它大小的空洞。同样地,值也会通过match的每一个模式,并且在遇到第一个“符合”的模式时,值会进入相关的代码块并在执行中被使用。

基础语法

match value {
    pattern1 => {
        //code1
    }
    pattern2 => {
        //code2
    }
    _ => {
        //没有任何匹配
    }
}

基础语法中,value是要匹配的变量,pattern是匹配模式, => 后面是要执行的代码。末尾使用通配符“ - ”(下划线)表示其他情况。如果value匹配了某个模式,就执行相应代码块,如果value没有匹配任何模式,就会执行默认的代码块,即( _ => {...},)。

让我们编写一个函数来获取一个未知的硬币,并以一种类似验钞机的方式,确定它时何种硬币并返回它的美分值。

//一个枚举和一个以枚举成员作为模式的match表达式
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 => 25,
    }
}

如果分支代码较短的话通常不使用大括号,如果想要在分支中运行多行代码,可以使用大括号。

fn value_in_cents(coin:Coin) -> u8 {
    match coin {
        Coin::Penny => {
            println!("Lucy penny!");
            1
        }
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter =>25,
    }
}

绑定值的模式

匹配分支的另一个有用的功能是可以绑定匹配的模式的部分值。也就是可以从枚举成员中提取值的方式。

举个例子,让我们修改枚举中的一个成员来存放数据。1999年到2008年间,美国在25美分的硬币的一侧为50个州的每一个都印刷了不同的设计。其他的硬币都没有这种区分州的设计,只有这些25美分的硬币有特殊的价值。可以将这些信息加入我们的enum,通过改变Quarter成员来包含一个State值。

//Quarter成员也存放一个UsState值的Coin枚举
#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
    //--snip--
}
 
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

假设我们的一个朋友正在尝试收集所有50个州25美分硬币。根据硬币类型分类零钱的同时,也可以报告出每个25美分硬币所对应的州名称,如果他没有的话,他可以将其加入收藏。

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
        }
    }
}

调用value_in_cents(Coin::Quarter(UsState::Alaska),coin将是Coin::Quarter(UsState::Alaska)。这时state绑定的值是UsState::Alaska。然后在pintln!表达式中使用这个绑定就可以获取Coin枚举的Quarter成员中内部的州的值。

匹配Option<T>

我们想要编写一个函数,它获取一个Option<i32>,如果其中含有一个值,将其加一。如果其中没有值,函数应该返回None值,二不尝试执行任何操作。

// 一个Option<i32>上使用match表达式的函数
fn plus_one (x: Option<i32>) -> Option<i32> {
    match x {
        None => None,
        Some(i) => Some(i+1),
    }
}
 
let five = Some(5);
let six =plus_one(five);
let none = plus_one(None);

匹配Some(T)

匹配是穷尽的

Rust知道我们没有覆盖所有可能的情况甚至指导哪些模式被忘记了!Rust中的匹配时穷尽的:必须穷举到最后的可能性来使代码有效。特别是在Option<T>的例子中,Rust防止我们忘记明确的处理None的情况,这让我们免于假设拥有一个实际上为空的值,从而错误不可能发生。

通配符和 _ 占位符

假设我们正在玩一个游戏,如果你掷出骰子的值为3,角色不会移动,而是会得到一顶新奇的帽子。如果掷出骰子的值为7,你的角色将失去新奇的帽子。对于其他的数值,你的角色会在棋盘上移动相应的格子。

let dice_roll = 9;
match dice_roll {
    3 => add_fancy_hat(),
    7 => remove_fancy_hat(),
    other => move_player(other),
}
 
fn add_fancy_hat() {}
fn remove_fancy_hat() {}
fn move_player(num_spaces: u8) {}

这是一个实现上述逻辑的match,匹配模式是字面值3和7,最后一个分支则涵盖了所有其他可能的值,模式是我们命名为other的一个变量。other分支的代码通过将其传递给move_player函数来使用这个变量。

最后一个模式没有列出u8所有可能的值,代码依旧能够编译。这种通配模式满足了match必须被穷尽的要求,必须将通配分支放在最后,因为模式是按顺序匹配的。

当我们不想使用通配模式获取的值时,可以使用 _ 模式。这个模式可以匹配任意值而不绑定到该值。

改变游戏规则:现在,当你掷出觉得值不是3或7的时候,你必须再次掷出。这种情况下我们不需要使用这个值。我们修改代码使用"_"代替变量other:

let dice_roll = 9;
match dice_roll {
    3 => add_fancy_hat(),
    7 => remove_fancy_hat(),
    _ => reroll(),
}
 
fn add_fancy_hat() {}
fn remove_fancy_hat() {}
fn reroll() {}

最后一个分支中明确忽略了其他的值,也满足了穷举性要求。

改变游戏规则:如果掷出3或7以外的值,你的回合将无事发生。使用单元值(空元组)作为_分支的代码:

let dice_roll = 9;
match dice_roll {
    3 => add_fancy_hat(),
    7 => remove_fancy_hat(),
    _ => (),
}
 
fn add_fancy_hat() {}
fn remove_fancy_hat() {}

到此这篇关于Rust控制流运算符match的用法详解的文章就介绍到这了,更多相关Rust控制流运算符match内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • Rust+React创建富文本编辑器

    Rust+React创建富文本编辑器

    这篇文章主要为大家介绍了Rust+React创建富文本编辑器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Rust?Atomics?and?Locks内存序Memory?Ordering详解

    Rust?Atomics?and?Locks内存序Memory?Ordering详解

    这篇文章主要为大家介绍了Rust?Atomics?and?Locks内存序Memory?Ordering详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • rust语言基础pub关键字及Some语法示例

    rust语言基础pub关键字及Some语法示例

    这篇文章主要为大家介绍了rust语言基础pub关键字及Some语法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Rust Option类型基本使用详解

    Rust Option类型基本使用详解

    Rust的Option是一种强大的类型,用于处理可能为空的情况,避免了许多空值引起的运行时错误,本文介绍Rust Option类型详解,感兴趣的朋友一起看看吧
    2024-02-02
  • 使用Rust制作康威生命游戏的实现代码

    使用Rust制作康威生命游戏的实现代码

    这篇文章主要介绍了使用Rust制作康威生命游戏,初始rust项目,使用wasm的项目模板,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • 详解Rust中的所有权机制

    详解Rust中的所有权机制

    Rust?语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码,这篇文章主要介绍了Rust中的所有权机制,需要的朋友可以参考下
    2022-10-10
  • Rust开发环境搭建到运行第一个程序HelloRust的图文教程

    Rust开发环境搭建到运行第一个程序HelloRust的图文教程

    本文主要介绍了Rust开发环境搭建到运行第一个程序HelloRust的图文教程,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • Rust中类型转换在错误处理中的应用小结

    Rust中类型转换在错误处理中的应用小结

    随着项目的进展,关于Rust的故事又翻开了新的一页,今天来到了服务器端的开发场景,发现错误处理中的错误类型转换有必要分享一下,对Rust错误处理相关知识感兴趣的朋友一起看看吧
    2023-09-09
  • Rust应用调用C语言动态库的操作方法

    Rust应用调用C语言动态库的操作方法

    这篇文章主要介绍了Rust应用调用C语言动态库,本文记录了笔者编写一个简单的C语言动态库,并通过Rust调用动态库导出的函数,需要的朋友可以参考下
    2023-01-01
  • Rust中的关联类型总结

    Rust中的关联类型总结

    关联类型是定义通用trait的一种机制。它允许在trait中定义一个或多个占位符类型,这些类型将在trait的实现中具体化。文中有详细示例代码供参考,需要的朋友可以阅读一下
    2023-05-05

最新评论


http://www.vxiaotou.com