学习rust的第五、六天,学习资料是官网的《The Rust Programming Language》,本笔记的内容包括第13-15章的内容
Chapter 13 Functional Language Features: Iterators and Closure
本章主要内容:
- Closure,function-like的结构,可以存储在变量中
- Iterators,处理一系列元素的方法
- 如何利用以上两种特性来增强上一章的代码
- 以上两种特性的性能分析
13.1 Closures: Anonymous Functions that Can Capture Their Environment
目标:代码在程序中仅定义一次,同时仅在需要时调用一次
closure的声明使用let语句,声明表示这个closure包含一个匿名函数的定义,不代表其包含一个匿名函数的运行结果。
closure不要求声明参数的类型,或返回值的类型,这一点与函数是不同的。由于函数作为显式的用户接口,必须声明其参数与返回值的类型,作为所有使用这个函数的成员的“共识”。但是闭包不同,闭包不作为暴露的接口,仅为一个匿名函数,存储在变量中,因而不需要做类型声明。
closure的类型是编译器推测的,但是仅能用作一种类型。
所有的闭包至少实现以下之一的trait:
Fn, FnMut, FnOnce
闭包具有的函数所没有的性质:capture their environment and access variables from the scope in which they’re defined.
fn main() {
let x = 4;
let equal_to_x = |z| z == x; //注意此处,我们并没有把x作为参数传递给闭包,但是它依然可以访问x的值,因为他们定一下相同的scope下
let y = 4;
assert!(equal_to_x(y));
}
closure从环境中抓取值的方式有三种,这三种方式分别对应着函数获得变量的三种方法:taking ownership、borrowing mutably和borrowing immutably。他们被编码进了三种Fn trait:
FnOnce
从其scope中获取变量,并得到变量的ownership,将其move到closure中。Once表示闭包无法超过一次获得同个变量的ownershipFnMut
mutably borrow,从而可以改变环境Fn
immutably borrow
13.2 Processing a Series of Items with Iterators
所有的Iterator都具有trait:Iterator
,在标准库中定义:
pub trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
// methods with default implementations elided
}
定义一个iterator的关键在于实现next函数
注意rust中的iterator是“lazy”的,什么也不做,除非被调用。
13.3 Improving Our I/O Project
本节内容见代码Chapter12
13.4 Comparing Performance: Loops vs. Iterators
本节内容仅给出结论:Iterator的速度很快,比loop的效率高,可以放心大胆地使用~
zero-cost abstraction
Chapter 14, More About Cargo and Crates.io
本章的内容可以帮助程序媛做到:
- Customize your build through released profile
- 在crates.io发布libraries
- 使用workshop组织大规模的项目
- 从crates.io安装binaries
- 使用custom commands扩展Cargo
14.1 Customizing Builds
Cargo具有两个主要文件:dev
:在运行cargo run时使用;release
:在运行cargo build --release。
当Cargo.toml文件中没有指定[profile.*]
时,cargo对每个文件都有默认的设置。通过加入[profile.*]
可以重写默认值:
[profile.dev]
opt-level = 0 //规定了rust对代码进行优化的次数