Rust编程-函数式编程

函数式编程:

        函数式风格编程通常包括将函数当作参数、将函数作为其他函数的返回值或将函数赋给变量以备之后执行等。

        闭包:

                一个类似函数,并且可以存储在变量中的结构。闭包拥有很好的运行性能。

                闭包可以存入变量或作为参数传递给其他函数的匿名函数。

                闭包可以从定义它的作用域中获取值。

        迭代器:

                处理一系列元素的方法。

闭包:

                闭包不要求明确标注参数和返回值的类型,因为闭包永远不会作为公共接口对外暴露。因此编译器能够推导出参数和返回值的类型。但是,一旦编译器推导类型确定了,那么就只能传入该类型的参数。

        结构体、枚举或函数参数中使用闭包:

                闭包在结构体中必须指明类型,因为结构体中各个字段的类型在定义时就必须确定。每一个闭包实例都有它自己的匿名类型。两个闭包拥有完全相同的签名,它们的类型也被认为是不一样的。

               所有的闭包都至少实现了标准库中提供的Fn、 FnMut及FnOnce中的一个trait。

               Fn Trait: 
                        Fn的trait约束中添加代表了闭包参数和闭包返回值的类型。

struct Cacher<T>where T:Fn(u32)->u32
{calculation:T,value:Option<u32>
}

               泛型T的类型约束是Fn Trait。

       闭包捕获上下文环境

                闭包可以捕获自己所在的环境并访问自己被定义时的作用域中的变量。

                闭包从上下文环境中获取变量有三种方式: 获取所有权、可变借用及不可变借用,三种方式分别被封装在三种不同的Trait中:

                FnOnce:闭包必须在定义时取得这些变量的所有权并将它们移动至闭包中。可以通过在参数列标签添加move,

                FnMut:可以从环境中可变地借用值并对它们进行修改

                Fn:可以从环境中不可变地借用值。

    let equal_to_x = move |z| z == x;

   迭代器:

        迭代器模式允许你依次为序列中的每一个元素执行某些任务

        创建一个迭代器:

                在Rust中,迭代器是惰性的(layzy)。这也就意味着创建迭代器后,除非你主动调用方法来消耗并使用迭代器,否则它们不会产生任何的实际效果。

                terator trait:迭代器trait

pub trait Iterator{type Item; // 定义关联类型fn next(&mut self) -> Option<Self::Item>; // Self::Item
}

              

let v1 = vec![1,2,3];
let  mut v1_iter = v1.iter();
assert_eq!(v1_iter.next(),Some(&1)); // 这里所&1,表示所对值1的引用

       iter:生成的是一个不可变引用的迭代器   

        into_iter: 生成一个获取所有权,并返回元素本身的迭代器

        iter_mut:返回一个可变引用的迭代器,允许你遍历集合并可能修改其中的元素。

        消耗迭代器的方法:

                next方法:调用next的方法也被称为消耗适配器 (consuming adaptor)

                sum()方法:获取迭代器的所有权并反复调用next来遍历元素,进而导致迭代器被消耗

        

let v1 = vec![1, 2, 3];
let v1_iter = v1.iter();
let total: i32 = v1_iter.sum();
assert_eq!(total, 6);
println!("{:?}",v1_iter); // 报错,所有权已经被sum函数占有使用

                生成其他迭代器的方法:

                        map:    

let v1: Vec<i32> = vec![1, 2, 3];
let iter_v1:Vec<i32> = v1.iter().map(|x| x + 1).collect();
assert_eq!(iter_v1,vec![2,3,4]);

             调用map方法创建新迭代器,接着再调用collect方法将其消耗掉并得到一个动态数组                                  

                       filter:

                                

fn shoes_in_my_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {shoes.into_iter().filter(|s| s.size == shoe_size).collect()}

                

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/46093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见问题记录(持续更新)

备注&#xff1a; 在7月10日记录之前遇到的问题及解决方法: 一&#xff1a;常见的访问问题&#xff1a; 403 Forbidden&#xff1a;&#xff08;未有请求权限&#xff09; 表示服务器理解请求但是拒绝执行它。这通常是由于服务器上的文件或资源没有正确的读、写或执行权限&…

python接口自动化(二十四)--unittest断言——中(详解)

1.简介 上一篇通过简单的案例给小伙伴们介绍了一下unittest断言&#xff0c;这篇我们将通过结合和围绕实际的工作来进行unittest的断言。这里以获取城市天气预报的接口为例&#xff0c;设计了 2 个用例&#xff0c;一个是查询北京的天气&#xff0c;一个是查询 南京为例&#…

[MySQL][数据类型]详细讲解

目录 1.说明1.数据类型分类2.数值类型1.int类型2.bit类型3.浮点数类型1.float2.decimal 3.字符串类型1.char2.varchar3.char和varchar比较 4.日期和时间类型5.enum和set1.基本语法2.查询数据 1.说明 MySQL表中建立属性列&#xff0c;列名称 类型 num tinyint unsigned;与C/C语…

高级java每日一道面试题-2024年7月14日

面试官: 你对java反射了解多少 我回答 什么是java反射&#xff1a; Java反射机制是一种强大的运行时自省机制&#xff0c;允许程序在运行时检查和操作类、接口、构造器、方法和字段等类型信息。通过反射&#xff0c;Java程序可以在运行时动态地加载类、创建对象、调用方法、…

优化Cocos Creator 包体体积

优化Cocos Creator 包体体积 引言一、优化图片文件体积&#xff1a;二、优化声音文件体积&#xff1a;三、优化引擎代码体积&#xff1a;四、 优化字体字库文件大小&#xff1a; 引言 优化Cocos Creator项目的包体体积是一个常见且重要的任务&#xff0c;尤其是在移动设备和网…

【Flowable | 第二篇】使用Flowable实现请假流程

文章目录 3.使用Flowable实现请假流程3.1部署测试环境3.2工作流/我的任务菜单3.3设计请假流程3.4绑定业务表3.5申请请假3.6节点审批人审批3.6.1审批动作3.6.2流程状态 3.使用Flowable实现请假流程 3.1部署测试环境 我们使用开源的若依框架&#xff0c;来实现Flowable请假流程…

17102 “一条路径图”的最大独立集问题

这个问题可以通过动态规划来解决。我们可以定义一个数组f&#xff0c;其中f[i]表示从最左边的节点沿着一条路径到节点vi为止&#xff0c;具有的独立集最大权值之和。然后我们可以通过比较f[i-1]&#xff0c;f[i-2]w[i]和w[i]的值&#xff0c;来更新f[i]。 以下是解题步骤&…

应用数学与机器学习基础 - 多任务学习篇

序言 在人工智能的浩瀚星空中&#xff0c;深度学习作为一颗璀璨的明星&#xff0c;正引领着技术革命的新浪潮。随着数据量的爆炸性增长和计算能力的飞跃&#xff0c;深度学习模型在诸多领域展现出了前所未有的性能与潜力。而多任务学习&#xff08;Multi-Task Learning, MTL&a…

量化交易的高效实施方法

量化交易因其高效性和科学性&#xff0c;在现代金融市场中受到越来越多的关注。高效实施量化交易策略不仅需要先进的技术支持&#xff0c;还需要精确的策略设计和严格的风险管理措施。以下是一些实现高效量化交易的关键方法。 首先&#xff0c;策略开发是量化交易的核心。成功…

Memcached负载均衡:揭秘高效缓存分发策略

标题&#xff1a;Memcached负载均衡&#xff1a;揭秘高效缓存分发策略 在分布式缓存系统中&#xff0c;Memcached通过负载均衡技术来提高缓存效率和系统吞吐量。负载均衡确保了缓存请求能够均匀地分配到多个缓存节点上&#xff0c;从而防止任何一个节点过载。本文将深入探讨Me…

从 Pandas 到 Polars 十五:对于特征工程,Polars的透视表(pivot)功能表现非常强大

最近在我的机器学习流程中&#xff0c;我发现自己会用自己编写的Polars表达式来替换一些更简单的scikit-learn指标&#xff0c;如均方根误差。这种方法省去了将数据复制到不同格式的麻烦&#xff0c;并确保我能够保持Polars的正常优势&#xff0c;如并行化、优化和扩展到大型数…

科技云报道:产业为根大模型应用为擎,容联云推动企业营销服场景重塑

科技云报道原创。 “没有应用&#xff0c;光有一个基础模型&#xff0c;不管是开源还是闭源&#xff0c;一文不值。”在2024世界人工智能大会&#xff08;WAIC 2024&#xff09;现场&#xff0c;百度创始人、董事长兼首席执行官李彦宏直言。 国产大模型的种类越发丰富&#x…

纯净IP的重要性解析与测评分析

作为连接互联网世界的桥梁&#xff0c;IP地址的纯净度不仅关乎网络访问的速度与稳定性&#xff0c;更是影响着数据安全与隐私保护。今天&#xff0c;我们将带您深入探索纯净IP的重要性&#xff0c;并分享我们对芝麻HTTP与巨量IP这两家提供纯净SOCKS5代理服务的深度测评分析。 一…

AI算法15-弹性网络回归算法Elastic Net Regression | ENR

弹性网络回归算法简介 在机器学习领域中&#xff0c;弹性网络&#xff08;Elastic Net&#xff09;是一种结合了L1范数&#xff08;套索回归&#xff09;和L2范数&#xff08;岭回归&#xff09;的正则化方法。它综合了两者的优点&#xff0c;既可以实现特征选择&#xff0c;又…

ubuntu18修改文件打开数

Ubuntu18永久修改 最大文件打开数和最大线程数 1、查看操作系统&#xff1a; cat /etc/os-release2、查看当前用户设置&#xff1a; ulimit -a 或者&#xff1a; ulimit -nopen files 是当前最大文件打开数量 max user processes是当前最大线程数量 3、永久修改配置&#x…

【学习笔记】4、组合逻辑电路(下)

接前文《【学习笔记】4、组合逻辑电路(上)》 4.4.5 算术运算电路 1. 半加器和全加器 半加器和全加器是算术运算电路中的基本单元。半加器和全加器是1位相加的组合逻辑电路。 &#xff08;1&#xff09;半加器 半加器&#xff1a;只考虑两个加数本身&#xff0c;不考虑低位进…

【第27章】MyBatis-Plus之Mybatis X 插件

文章目录 前言一、安装指南二、核心功能1.XML 映射跳转2.代码生成3. 重置模板 三、JPA 风格提示四、常见问题解答1. JPA 提示功能无法使用&#xff1f;2. 生成的表名与预期不符&#xff1f; 五、代码生成模板配置1. 默认模板2. 重置默认模板3. 自定义模板内容3.1 实体类信息3.2…

暑期备考2024小学生古诗文大会:吃透历年真题和知识点(持续)

2024年上海市小学生古诗文大会的自由报名初赛将于10月19日&#xff08;星期六&#xff09;正式开始&#xff0c;还有3个多月的时间。 为帮助孩子们备考&#xff0c;我持续分享往年上海小学生古诗文大会真题&#xff0c;这些题目来自我去重、合并后的1700在线题库&#xff0c;每…

Python中的pytest的使用

使用pytest可以做测试 pip 安装 pip install pytest有可能得配置环境变量&#xff01; 下面代码展示 文件名必须得是 test_ 开头 或者 _test 结尾 import pytestdef add(x, y):return x ydef test1():assert 3 add(1, 2)def test2():assert 2 add(1, 1)if __name__ __ma…

Python中的数据容器及其在大数据开发中的应用

在Python编程中&#xff0c;数据容器是存储和组织数据的基本工具。作为大数据开发者&#xff0c;了解并灵活运用各种容器类型对于高效处理大规模数据至关重要。今天&#xff0c;我们将从Set出发&#xff0c;探讨Python中的各种数据容器&#xff0c;以及它们在大数据处理中的应用…