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()
}
上一篇: 如何玩转澳大利亚Facebook直播?
下一篇: ARM功耗管理标准接口之ACPI
推荐阅读
-
玩转JS函数式编程_013] 4.1 JavaScript纯函数相关概念(中4.1 JavaScript 纯函数相关概念(中):函数副作用的几种具体表现
-
如何针对非线性约束条件使用 ipopt 使目标函数最小化(NLP 非线性编程)内点法)
-
[ECMAScript 从入门到进阶教程] 第三部分:高级主题(高级函数和范例、元编程、正则表达式、性能优化)
-
橙色 Pi 5 嵌入式应用程序编程] - 用户空间 I2C 通信
-
Java 8新特性探究(十三)JavaFX 8新特性以及开发2048游戏-JavaFX历史## 跟java在服务器端和web端成绩相比,桌面一直是java的软肋,于是Sun公司在2008年推出JavaFX,弥补桌面软件的缺陷,请看下图JavaFX一路走过来的改进 从上图看出,一开始推出时候,开发者需使用一种名为JavaFX Script的静态的、声明式的编程语言来开发JavaFX应用程序。因为JavaFX Script将会被编译为Java bytecode,程序员可以使用Java代码代替。 JavaFX 2.0之后的版本摒弃了JavaFX Script语言,而作为一个Java API来使用。因此使用JavaFX平台实现的应用程序将直接通过标准Java代码来实现。 JavaFX 2.0 包含非常丰富的 UI 控件、图形和多媒体特性用于简化可视化应用的开发,WebView可直接在应用中嵌入网页;另外 2.0 版本允许使用 FXML 进行 UI 定义,这是一个脚本化基于 XML 的标识语言。 从JDK 7u6开始,JavaFx就与JDK捆绑在一起了,JavaFX团队称,下一个版本将是8.0,目前所有的工作都已经围绕8.0库进行。这是因为JavaFX将捆绑在Java 8中,因此该团队决定跳过几个版本号,迎头赶上Java 8。 ##JavaFx8的新特性 ## ###全新现代主题:Modena 新的Modena主题来替换原来的Caspian主题。不过在Application的start方法中,可以通过setUserAgentStylesheet(STYLESHEET_CASPIAN)来继续使用Caspian主题。 参考http://fxexperience.com/2013/03/modena-theme-update/ ###JavaFX 3D 在JavaFX8中提供了3D图像处理API,包括Shape3D (Box, Cylinder, MeshView, Sphere子类),SubScene, Material, PickResult, LightBase (AmbientLight 和PointLight子类),SceneAntialiasing等。Camera类也得到了更新。从JavaDoc中可以找到更多信息。 ###富文本 强化了富文本的支持 ###TreeTableView ###日期控件DatePicker 增加日期控件 ###用于 CSS 结构的公共 API
-
嵌入式ARM设计编程(二) 字符串复制
-
全面学习C++编程2(侯捷视频全集):掌握转换函数、显式类型转换、智能指针、成员模板等重要概念与技术
-
将温柔的编程教练添加到VSCode中?最佳互动式赞美功能,获得GitHub 2.5k 星赞,让你爱上编程!
-
深入理解C语言网络编程中的send函数
-
搞定C语言编程!带你了解函数的作用