Rust-Match控制流运算子

Match是使用枚举的基本工具,类似Golang的Switch语法

Match取值後对每个条件进行比较依照顺序比较,一但匹配成功就对右侧求值,并结算Match语法

每个条件分支右侧都必须是单个表达式

前面三个都是无效的表达式

match browser {
    Firefox => let var = 777;, // 无效的表达式
    Chrome => let var = 777, // 无效的表达式
    Ie =>  fu funct() {}, // 无效的表达式
    Safari => println!("S"),
}

如果需要在右侧好几个表达式或是非表达式可以用块来包起来

enum Browser {
    Firefox,
    Chrome,
    Ie,
    Safari,
}

let browser = Browser::Ie;

match browser {
    Browser::Firefox => {
        browser = Browser::Ie;
        println!("F");
    },
    Browser::Chrome => {
        let var = 777;
        println!("C")
    },
    Browser::Ie => println!("I"),
    Browser::Safari => println!("S"),
}

处理所有可能

enum Browser {
    Firefox,
    Chrome,
    Ie,
    Safari,
}

let browser = Browser::Ie;

match browser {
    Browser::Ie => println!("I"),
    Browser::Safari => println!("S"),
}

// 编译时会出
patterns `Firefox` and `Chrome` not covered

因为少了Firefox和Chrome条件分支,Rust要求mtch需要显式的处理所有可能的情况

可以使用空处理

let browser = Browser::Ie;

match browser {
    Browser::Firefox => {}, // 使用空处理
    Browser::Chrome => {}, // 使用空处理
    Browser::Ie => println!("I"),
    Browser::Safari => println!("S"),
}

或是使用"_"下底线,类似Golang的Default

let browser = Browser::Ie;

match browser {
    Browser::Ie => println!("I"),
    Browser::Safari => println!("S"),
    _ => {},
}

如果Default放在条件最上面会因为顺序关系什麽都不处理

let browser = Browser::Ie;

match browser {
    _ => {}, // 永远都跑到这里
    Browser::Ie => println!("I"),
    Browser::Safari => println!("S"),
}

对型别使用Match

match除了对枚举之外也可以对一般型别

match "value" {
    "value" => println!("value"),
    _ => println!("other"),
}

match 1 {
    1 => println!("one"),
    2 => println!("two"),
    3 => println!("three"),
    _ => println!("other"),
}

因为型别不像枚举有可穷举出所有,所以一定需要"_"(Default) 条件,不然编译会出现错误


<<:  各种 Code Generator 的功能

>>:  [DAY14]Label进阶使用-Affinity and anti-affinity

[前端暴龙机,Vue2.x 进化 Vue3 ] Day30.Vue3 网页小游戏(完结篇) | ♾ 台版鱿鱼游戏,玩?还是不玩?

终於~ 来到铁人赛的最後一天啦 今天的工作就是把小专题剩下的功能给完成,为这次的铁人赛欢呼~ 完赛啦...

Day 29 : 整理篇 — 统整 Obsidian 的使用流程,建构一个完整的笔记系统

辛苦写到这里,一套完整的 Obsidian 笔记系统已经建构完成,接下来我使用下方的流程图帮大家做个...

【第1天】前言

背景 曾任职被动元件厂的品保工程师,鉴於以往资料分析无法满足庞杂的资料与客户端需求,希望培养资料洞察...

[Day 07] 使用 fastAPI 部署 YOLOv4 (1/2) — 以内建 Client 进行互动

前言 我们花了将近一周的时间来介绍部署深度学习模型背後的概念,我想大家应该很想知道究竟该怎麽实作,所...

<Day11> Contract — 取得指数(Index)资讯

● 这章将以模拟帐户来示范如何取得指数(Index)资讯 回顾上一章,我们学会如何用Contract...