当前位置: 首页 > news >正文

广州网站建设50强名单it人必看的网站

广州网站建设50强名单,it人必看的网站,漳州本地网,网站建设jsRust学习(六):函数式编程 我们在前一篇博客中已经介绍了如何通过trait和impl实现Rust的面向对象编程,但是Rust本身实际上并不提倡通过类来解决问题。Rust推崇的是函数式编程,强调将函数作为参数值或者其他函数的返回值…

Rust学习(六):函数式编程

我们在前一篇博客中已经介绍了如何通过trait和impl实现Rust的面向对象编程,但是Rust本身实际上并不提倡通过类来解决问题。Rust推崇的是函数式编程,强调将函数作为参数值或者其他函数的返回值,将函数赋值给变量之后在继续执行。其中最重要的两个概念就是:闭包函数和迭代器。

1、闭包函数:

闭包函数是一种可以保存变量或作为参数传递给其他函数使用的匿名函数,和C++中的lambda表达式非常相似,闭包可以在一处创建,然后在不同的上下文中使用,同时闭包函数可以捕获调用者的作用域中的值:

//定义闭包函数:
|parameters| {cody_body;return_value
}

闭包函数还可以进一步简化,Rust可以自动推动闭包函数的参数类型和返回值类型,因此,闭包可以没有参数和返回值:

let is_even = |x| {x % 2 == 0
};let num = 10;
println!("{num} is even {}", is_even(num));

如上面这个案例所示:使用闭包可以只将其赋值给变量,然后就像调用函数一样调用它即可(doge),同时闭包也可以使用外部变量:

let val = 2;
let add_val = |x| {x + val};
let num = 2;
let res = add_val(num);
println!("{num} + {val} = {res}");

如果大家和记得前面对所有权的描述,,那就一定会好奇:这里的闭包函数获取的到底是外部变量的所有权还是外部变量的引用?Rust为此设计了三个trait:

  • FnOnce:使用这个trait的闭包函数会获取外部变量的所有权。
  • FnMut:获取外部变量的可变引用。
  • Fn:获取外部变量的借用值。

如果需要强制将外部变量所有权转移到闭包内,那么可以使用move关键字:

let val = 2;
let add_val = move |x| {x+val};

2、迭代器:

迭代器会把集合中所有元素按照顺序一个一个传递给处理逻辑,允许对一个序列进行某些处理,并且会遍历这个序列中的每一项以决定何时结束。我们之前使用的for循环就是一个迭代器,迭代器默认实现了Iterator trait——iter(),用于返回i迭代器和next(),用于返回迭代器的下一项,他们是迭代器的核心功能!

根据迭代器迭代时是否可以修改数据,iter()方法有三个版本:

  • iter():返回只读可重入迭代器,元素类型:&T
  • iter_mut():返回可修改可重入迭代器,元素类型:&mut T
  • into_iter():返回只读不可重入迭代器,元素类型:T

可重入是指:迭代后原始数据还能使用,不可重入则代表迭代器消费了原始数据(这里可以借用python中的pop()方法,取出元素,并删除)

let nums = vec![1, 2, 3, 4, 5, 6];//使用iter()方法:
for num in nums.iter() {println!("num:{num}");
}
println!("{:?}", nums);  //可以使用原数据nums//使用iter_mut()方法:
for num in nums.iter_mut() {*num += 1;
}
println!("{:?}", nums);  //可以使用原数据nums//使用into_iter()方法:
for num in nums.into_iter() {println!("num:{num}");
}
//for num in nums.iter() {println!("num:{num}");}  错误!nums已经被消费

消费是迭代器中的一种有趣且特殊的操作,sum, next, nth, fold等都是消费者,他们会对迭代器进行操作,得到最终值:

fn main() {let nums = vec![1, 2, 3, 4, 5, 6];let nums_iter = nums.iter();let total = nums_iter.sum::<i32>();let new_nums : Vec<i32> = (0..100).filter(|&n| n % 2 == 0).collect();println!("{:?}", new_nums);// 求小于等于1000的能被3或5整除的所有整数之和:let sum = (1..1000).filter(|n| n % 3 == 0 || n % 5 == 0).sum::<u32>();println!("{sum}");
}

实际上,除了函数式编程之外,还有命令式编程、声明式编程等多种编程范式。我们平时所用的面向对象编程(C++和python)和结构式编程(C)都属于命令式编程,命令式编程的主要思想是一步一步的精确的给出计算机运行程序的指令,而声明式编程(SQL)则以数据结构的形式表达变成逻辑,主要思想是告诉计算机应该做什么,而不是具体怎么做的(其实有点夸大了),函数式编程的思想和声明式编程类似,它更进一步是面向数学的抽象,旨在将计算描述为一种数学表达式求值,寻求一种输入输出的映射关系。

http://www.ritt.cn/news/21959.html

相关文章:

  • web网站开发前景怎么样友情链接是啥意思
  • 松江区做网站的公司线上商城推广软文
  • 网站和虚拟服务器销售人员培训课程有哪些
  • wordpress开启子目录多站点模式手机上制作网页
  • 海汇100做网站可靠吗推广游戏怎么拉人最快
  • 网站建设策划师网站联盟广告
  • 私人做的不错的网站河南新站关键词排名优化外包
  • 做网站价格多少app怎么开发出来的
  • 深圳做服装设计网站的公司2023年6月份又封城了
  • 销售网站建设的短文手游推广渠道
  • 淘宝seo什么意思做网站建设优化的公司排名
  • 网站如何做数据分析报告免费推广公司的网站
  • 中山 做网站恢复原来的百度
  • 网站seo综合公司西安关键词排名软件
  • 建网站需要营业执照吗惠州seo外包平台
  • 佛山外贸企业网站建设上海外贸网站seo
  • 武汉网站建设顾问网络推广工作好干吗
  • 从您的角度来看_对于农产品网站的建设有什么想法或建议呢?网络营销策略案例
  • 视频网站中滑动列表怎么做的宁波seo怎么做推广渠道
  • 牙科网站开发今日头条新闻军事
  • 做化妆品的网站河北关键词seo排名
  • 做网站jijianjianzhan公众号怎么开通
  • 电子商务网站建设论文开题报告关键词林俊杰歌词
  • 大连网站制作诚推ls15227百度seo还有前景吗
  • 如何利用建站平台服务客户武汉seo培训
  • 做短视频的网站小程序开发系统
  • 如何做配送网站优化关键词有哪些方法
  • 像优酷平台网站是怎么做的站长工具seo优化系统
  • 泰安哪里有做网站app的百度官网认证多少钱
  • 不囤货的网店怎么开seo专业论坛