首页 > 其他分享 >Rust 元組匹配的一個妙用

Rust 元組匹配的一個妙用

时间:2022-11-01 00:13:30浏览次数:65  
标签:Ok Err 一個 元組 Rust handle TODO fn

Rust 元組匹配的一個妙用

原文:https://nathanael-morris-bennett.medium.com/rust-tuple-pattern-matching-trick-c0f6bcdb4460

PS:原文的示例代碼中有幾處語法錯誤,本文對其進行了修正,並且示例代碼也有所不同。

如下代碼模仿一個人一天的行爲。

fn work()->Result<(), String> {
    // TODO
    Ok(())
}

fn eat()-> Result<(), String> {
    // TODO
    Ok(())
}

fn fuck()-> Result<(), String> {
    // TODO
    Ok(())
}

fn sleep() {
    // TODO
}

fn handle_err(e: String){
    // TODO
}

fn handle_ok() {
    // TODO
}

要求在所有事情都順利完成(返回 ())之後才能睡覺,否則直接返回,不接着做後面的事情。那麼普通情況怎麼寫呢?

fn main() {
    if let Ok(_) = work() {
        if let Ok(_) = eat() {
            if let Ok(_) = fuck() {
                handle_ok()
            } else if let Err(e3) = fuck() {
                handle_err(e3)
            }
        }else if let Err(e2) =eat() {
            handle_err(e2)
        }
    }else if let Err(e) = work() {
        handle_err(e)
    }
}

這就是最直白的,一個一個的去判斷,但是,如果你使用 match 則可以寫出下面這種代碼

fn main() {
    match (work(), eat(), fuck()) {
        (Ok(_), Ok(_), Ok(_)) => sleep(),
        (Err(e), _, _) | (_, Err(e), _) | (_, _, Err(e)) => handle_err(e),
    }
}

怎麼樣?是不是簡單了很多?也清楚了很多,如果三個函數返回的 Err 是不同類型的,也只需要把第二個條件拆分爲多個 Option,但是代碼可讀性依舊會很強。甚至於如果你不管什麼返回什麼 Err 類型的處理邏輯都是一樣的,那麼你甚至可以直接用 - 代替第二個匹配條件。

但是實際上,這個方式是三個方法都執行完了最終確定要不要 sleep,如果使用內聯閉包則可以寫成這樣

fn main() {
    match (|| Ok((work()?, eat()?, fuck()?)))() {
        Ok((_, _, _)) => sleep(),
        Err(e) => handle_err(e),
    }
}

這就可以保證當前一個函數沒有成功執行的時候根本不會執行下一個。原作者在文中還講了一個 and_than 的方法,因爲那樣寫連第一種都不如,所以本文不做介紹

标签:Ok,Err,一個,元組,Rust,handle,TODO,fn
From: https://www.cnblogs.com/ltozvxe/p/16846382.html

相关文章

  • Rust那些事之Vector妙用
    导语我们知道vector是一个动态数组,在C++中来说,vector中存储的只能是一种类型,那如何做到存储多个,无非就是包一层,例如:结构体、​​void*​​。而在Rust中enum非常独特,每个值可......
  • 推广TrustAI可信分析:通过提升数据质量来增强在ERNIE模型下性能
    项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4622139?contributionType=1fork一下,由于内容过多这里就不全部写出来了。前言TrustAI是集可信分析和增强......
  • rust的编译
    rust是一个预编译语言,类似C/C++写好一个rust源文件,其文件后缀为.rs文件编译命令rustcmain.rs在windows系统中,会输出如下文件main.exe,main.pdb其中pdb文件是一个附带......
  • Rust 学习之旅(7):Package,Crate,Module
    Rust学习之旅(7):Package,Crate,Module这是第7章的读书笔记,CargoWorkspace在第14章。PackagesandCratesAsaprojectgrows,youshouldorganizecodebysplittin......
  • Rust low 2 - 基本类型
    基本类型数值类型:有符号整数(i8,i16,i32,i64,isize)、无符号整数(u8,u16,u32,u64,usize)、浮点数(f32,f64)、以及有理数、复数字符串:字符串字面量和字符......
  • 证书生成(keystore、truststore、.crt、.key)
    https://blog.csdn.net/leadseczgw01/article/details/88844413https://blog.csdn.net/qq_28450911/article/details/114120752?spm=1001.2101.3001.6661.1&utm_medium=di......
  • Rust low 0 - 基本概念
    Ax计划开始rust学习笔记就放在博客园了,一共分为low级别、mid级别、high级别三个学习阶段Bx新概念(编程语言从未有过的概念)所有权、借用、生命周期宏编程模式匹配C......
  • Rust 实现的简单 http 转发
    学习Rust时练手的小程序,功能类似代理,将网络请求转发到新的地址和端口。目前只有http请求的转发,未来希望能够代理各种常用的网络协议。代码地址:https://gitee.com/wangyub......
  • Rust 开源 MySQL 库连接地址带特殊字符问题
    描述插件地址:https://crates.io/crates/mysql如果使用默认的连接方式此扩展并不会对连接地址中的#等符号进行转义:leturl=encode("mysql://root:abc#1234@12......
  • 【番外篇】Rust环境搭建+基础开发入门+Rust与.NET6、C++的基础运算性能比较
    前言:突然想打算把Rust作为将来自己主要的副编程语言。当然,主语言还是C#,毕竟.NET平台这么强大,写起来就是爽。缘起:之前打算一些新的产品或者新的要开发的东西,由于没有历史包......