返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >rust解决嵌套——Option类型的map和and_then方法的使用
  • 242
分享到

rust解决嵌套——Option类型的map和and_then方法的使用

rustOption类型的map和and_then方法rust嵌套 2023-02-04 12:02:33 242人浏览 薄情痞子
摘要

目录map方法的使用and_then方法的使用rust基础学习历程先提一个建议如果是通过rust官网入门的话,个人感觉《通过例子学 Rust》会比《Rust 程序设计语言》更好一些。

先提一个建议如果是通过rust官网入门的话,个人感觉《通过例子学 Rust》会比《Rust 程序设计语言》更好一些。

我这里的例子实际上也是官网上的例子,对于看一遍不太清晰的例子,我会选择自己写下来。

这篇文章假设你已经了解了关于Option类型的一些概念(实际上是rust用来处理空值的工具)。

map方法的使用

需求:假设我想吃一种食物,这个食物需要经过削皮、切块和煮熟这三个线性的流程,此外在这三个流程之前,我还要判断这个原材料是否存在,只有以上条件全部满足,才能达成eat的目标。

我们可以这样去设计:食物本身是一个Option选项,此外每经过上面的一个流程,就可以将食物包裹在一个对应的元组结构体之中。于是我们有了下面的写法:

struct Peeled(String);
struct Choped(String);
struct Cooked(String);
// 削皮
fn peel(food: Option<String>) -> Option<Peeled> {
    match food {
        Some(food) => Some(Peeled(food)),
        None => None,
    }
}
// 切块
fn chop(peeled_food: Option<Peeled>) -> Option<Choped> {
    match peeled_food {
        Some(Peeled(food)) => Some(Choped(food)),
        None => None,
    }
}
// 烹饪
fn cook(choped_food: Option<Choped>) -> Option<Cooked> {
    match choped_food {
        Some(Choped(food)) => Some(Cooked(food)),
        None => None,
    }
}
// 吃
fn eat(food: Option<Cooked>) {
    match food {
        Some(Cooked(food)) => println!("俺今天吃了{food}"),
        None => println!("没吃"),
    }
}

尝试完整走完这个流程

let real_food = Some(String::from("猪头肉"));
eat(cook(chop(peel(real_food))));

明显可以看到这里有一个函数的嵌套,不是非常雅观,那么我们可以使用Option类型的map方法对三个处理过程进行改写,改成一个函数叫process_food

fn process_food(food: Option<String>) -> Option<Cooked> {
    food.map(|f| Peeled(f))
        .map(|Peeled(f)| Choped(f))
        .map(|Choped(f)| Cooked(f))
}

这个map当中是一个闭包,以第一个闭包为例,它只处理Some的情况,它会将Some(food:String)转换成Some(Peeled(food)),否则直接返回None,当然这里还涉及到一个解构的问题,上面的f实际上全部是函数的参数food包裹的那个String(讲的很抽象)。

可以调用一下,实际上还是能运行的

  let real_food1 = Some(String::from("烧鸡"));
  eat(process_food(real_food1));

and_then方法的使用

需求,有一些食物,我只吃能飞和有腿的,如果符合要求就以Some(food)的形式返回

enum Food {
    Fish,
    Chiken,
    Cow,
}
// 进行能飞和有腿的检测,能通过的话就用Some包裹起来
fn has_legs(food: Food) -> Option<Food> {
    match food {
        Food::Fish => None,
        _ => Some(food),
    }
}
fn can_fly(food: Food) -> Option<Food> {
    match food {
        Food::Chiken => Some(food),
        _ => None,
    }
}
fn eat1(food: Option<Food>) {
    match food {
        Some(_food) => println!("i can eat it"),
        None => println!("i am hungury"),
    }
}

将上面的两个检测函数组合成一个

fn test(food: Food) -> Option<Food> {
    match has_legs(food) {
        None => None,
        Some(food) => match can_fly(food) {
            Some(food) => Some(food),
            None => None,
        },
    }
}

这里的test又变成了一个match的嵌套,这里的检测在流程上没有顺序要求,当然你可以通过改写match的流程来固定顺序,可以用and_then来进行改写

fn test1(food: Food) -> Option<Food> {
    has_legs(food).and_then(can_fly)
}
 eat1(test(Food::Chiken));
 eat1(test(Food::Fish));
 eat1(test1(Food::Cow));

运行起来都是一样的。

这两个方法的用法情境有什么不同呢?恕我才疏学浅,暂时不能用准确的言语进行概括

rust基础学习历程

目前的水平只能说是入门,之前分别在21和22年入门过两次,均是失败告终,一方面rust确实火星,另一方面我自学编程当时只有js基础。

23年初的这次入门终于成功了,原因有二,一是我学了ts和golang+hello world程度的c++,对类型、栈堆、指针之类的概念有了点基础的理解。二是我明白了rust那些火星般的新特点是针对编程中的老问题提出的,从实用角度去理解能更好掌握这些新的特点。

我认为rust的特点是:你会比以往更了解自己写的代码。

希望能有更多人学习这门语言,我也会尽可能以一个业余者的身份更新一些rust或者其他编程的基础知识。

到此这篇关于rust解决嵌套——Option类型的map和and_then方法的文章就介绍到这了,更多相关rust Option类型的map和and_then方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: rust解决嵌套——Option类型的map和and_then方法的使用

本文链接: https://lsjlt.com/news/194189.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • rust解决嵌套——Option类型的map和and_then方法的使用
    目录map方法的使用and_then方法的使用rust基础学习历程先提一个建议如果是通过rust官网入门的话,个人感觉《通过例子学 Rust》会比《Rust 程序设计语言》更好一些。...
    99+
    2023-02-04
    rust Option类型的map和and_then方法 rust 嵌套
  • Java多层嵌套JSON类型数据的方法
    本篇内容介绍了“Java多层嵌套JSON类型数据的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!多层嵌套JSON类型数据解析简单来说:“...
    99+
    2023-06-29
  • MySQL游标的嵌套使用方法
    本篇内容主要讲解“MySQL游标的嵌套使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL游标的嵌套使用方法”吧! 前...
    99+
    2024-04-02
  • Golang中map数据类型的使用方法
    目录前言案例mapmap定义map声明map的操作总结前言 今天咱们来学习一下golang中的map数据类型,单纯的总结一下基本语法和使用场景,也不具体深入底层。map类型是什么呢?...
    99+
    2024-04-02
  • 如何使用sql查询嵌套的数据类型
    本篇内容介绍了“如何使用sql查询嵌套的数据类型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!【问题详细描...
    99+
    2024-04-02
  • Android之ScrollView嵌套ListView和GridView冲突的解决方法
    那么里面的ScrollView高度计算就会出现问题。我们也就无法得到想要的效果。核心解决方案: 重写ListView或者GridView的OnMesure 方法。 代码如下:p...
    99+
    2022-06-06
    方法 listview scrollview gridview Android
  • Spring AOP对嵌套方法不起作用的解决方法
    本篇文章为大家展示了Spring AOP对嵌套方法不起作用的解决方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Spring AOP对嵌套方法不起作用今天在调研系统操作记录日志时,好多教...
    99+
    2023-06-22
  • Spring AOP对嵌套方法不起作用的解决
    目录Spring AOP对嵌套方法不起作用要解决这个问题Spring AOP、嵌套调用失效及解决加入注解获取当前代理的接口需要嵌套调用的Service实现它调用的时候改写代码Spri...
    99+
    2024-04-02
  • Repeater的嵌套使用方法是什么
    Repeater的嵌套使用方法是将一个Repeater放置在另一个Repeater的ItemTemplate中。这样可以实现多层嵌套...
    99+
    2023-09-29
    Repeater
  • repeater嵌套使用的方法是什么
    在Python中,可以使用嵌套的方式来使用repeater模块的方法。具体方法如下:首先,导入repeater模块:```pytho...
    99+
    2023-08-26
    repeater
  • Android中listview嵌套scrollveiw冲突的解决方法
    一.使用网上用的动态改变listview高度的方法 该方法只适用于item布局是LinearLayout布局的情况,不能是其他的,因为其他的Layout(如RelativeLa...
    99+
    2022-06-06
    方法 listview Android
  • 禁止网站被iframe嵌套的解决方法
    有时候我们开发的网站可能会被别人利用嵌入到其他网站中,也就是别人镜像我们的网站,造成点击劫持风险。 目前收集到的有以下前后端2种维度来防止网页被iframe嵌套的办法: 一、前端 针对传统的Clickjacking,一般是通过禁止跨域的if...
    99+
    2023-08-31
    前端 javascript 开发语言
  • python函数的两种嵌套方法使用
    目录交叉嵌套回环函数python函数的两种嵌套方法使用函数的嵌套有两种方式: 交叉嵌套回环嵌套 交叉嵌套 交叉嵌套的方式是在本函数中调用同一级或上一级函数的嵌套方法: def fun...
    99+
    2024-04-02
  • 控件Repeater嵌套使用的方法是什么
    在ASP.NET中,可以通过在Repeater控件的ItemTemplate中嵌套另一个Repeater控件来实现Repeater的...
    99+
    2023-09-25
    Repeater
  • Android Fragment多层嵌套重影问题的解决方法
    1解决bug的思想: //step1:当bug被发现(排除极低偶然性,单次性,开发工具导致) //step2:根据经验判断bug的重现场景,多次测试,直到精准的定位bug //...
    99+
    2022-06-06
    android fragment 方法 fragment 嵌套 Android
  • python函数的两种嵌套方法怎么使用
    本篇内容介绍了“python函数的两种嵌套方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!交叉嵌套交叉嵌套的方式是在本函数中调用同...
    99+
    2023-06-29
  • 织梦DEDEEIMS标签不能嵌套的2种解决方法
    如下标签:复制代码代码如下:{dede:list pagesize=’6′}<li><a href="/plus/jobs.phplang={dede:global.user_l...
    99+
    2022-06-12
    织梦 DEDEEIMS 标签不能嵌套
  • vue router路由嵌套不显示问题的解决方法
    这篇文章给大家分享的是有关vue router路由嵌套不显示问题的解决方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue router路由嵌套不显示问题的解决方法,具体内容...
    99+
    2024-04-02
  • android线性布局嵌套使用的方法是什么
    在Android中,可以通过在布局文件中使用嵌套的线性布局来实现复杂的界面布局。下面是嵌套使用线性布局的方法:1. 在布局文件中使用...
    99+
    2023-10-10
    Android
  • Shell脚本中$符号的嵌套使用方法小结
    目录1 示例2 说明本文主要介绍在编写 Shell 脚本时,通过嵌套使用 $ 符号,间接获取变量或表达式的值的具体方法。 先说结论,在 Shell 脚本中,可以通过使用 eval 命令来实现 $ 符号的嵌套使用...
    99+
    2023-05-06
    Shell $符号嵌套 Shell $符号
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作