36-链式方法
链式方法 — Easy Rust 中文译本
译文 · 基于 Easy Rust
原文链接: https://dhghomon.github.io/easy_rust/Chapter_35.html
中文参考:kumakichi/easy_rust_chs
链式方法
Rust是一种系统编程语言,就像C和C++一样,它的代码可以写成独立的命令,单独成行,但它也有函数式风格。两种风格都可以,但函数式通常比较短。下面以非函数式(称为 “命令式”)为例,让Vec从1到10。
1
2
3
4
5
6
7
8
9
10
11
| fn main() {
let mut new_vec = Vec::new();
let mut counter = 1;
while counter < 11 {
new_vec.push(counter);
counter += 1;
}
println!("{:?}", new_vec);
}
|
这个打印[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]。
而这里是函数式风格的例子:
1
2
3
4
5
6
| fn main() {
let new_vec = (1..=10).collect::<Vec<i32>>();
// 也可以这样写:
// let new_vec: Vec<i32> = (1..=10).collect();
println!("{:?}", new_vec);
}
|
.collect()可以为很多类型做集合,所以我们要告诉它类型。
用函数式可以链接方法。“链接方法"的意思是把很多方法放在一个语句中。下面是一个很多方法链在一起的例子。
1
2
3
4
5
6
7
| fn main() {
let my_vec = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let new_vec = my_vec.into_iter().skip(3).take(4).collect::<Vec<i32>>();
println!("{:?}", new_vec);
}
|
这样就创建了一个[3, 4, 5, 6]的Vec。这一行的信息量很大,所以把每个方法放在新的一行上会有帮助。让我们这样做,以使其更容易阅读。
1
2
3
4
5
6
7
8
9
10
11
| fn main() {
let my_vec = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let new_vec = my_vec
.into_iter() // 对元素做“迭代”(iterate = 逐个处理)。into_iter() 给出所有权,不是引用
.skip(3) // 跳过三个元素:0、1 和 2
.take(4) // 取接下来四个:3、4、5 和 6
.collect::<Vec<i32>>(); // 放进新的 Vec<i32>
println!("{:?}", new_vec);
}
|
当你了解闭包和迭代器时,你可以最好地使用这种函数式。所以我们接下来将学习它们。