13.7.0. 写在正文之前
Rust语言在设计过程中收到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。
在本章中,我们会讨论 Rust 的一些特性,这些特性与许多语言中通常称为函数式的特性相似:
- 闭包
- 迭代器(本文)
- 使用闭包和迭代器改进I/O项目
- 闭包和迭代器的性能
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(==)
13.7.1. 使用闭包捕获环境
filter
方法是一个迭代器适配器,一般搭配闭包捕获环境来使用。
filter
方法接收一个闭包,这个闭包在遍历迭代器的每个元素时返回布尔类型。如果返回值为true
,那么当前元素将会包含在filter
方法产生的新一个迭代器中;反之,当前元素将不会包含在filter
产生的迭代器中。
看个例子:
使用带有闭包的filter
来捕获shoe_size
变量从其环境中迭代Shoe
结构实例的集合。它将仅返回指定尺寸的鞋子。
#[derive(PartialEq, Debug)]
struct Shoe {
size: u32,
style: String,
}
fn shoes_in_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {
shoes.into_iter().filter(|s| s.size == shoe_size).collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn filters_by_size() {
let shoes = vec![
Shoe {
size: 10,
style: String::from("sneaker"),
},
Shoe {
size: 13,
style: String::from("sandal"),
},
Shoe {
size: 10,
style: String::from("boot"),
},
];
let in_my_size = shoes_in_size(shoes, 10);
assert_eq!(
in_my_size,
vec![
Shoe {
size: 10,
style: String::from("sneaker")
},
Shoe {
size: 10,
style: String::from("boot")
},
]
);
}
}
-
结构体
Shoe
有两个字段,size
代表尺码,是u32
类型,style
代表款式,是String
类型 -
shoes_in_size
这个函数接收两个参数,一个shoes
,类型是Vec<Shoe>
;另一个是shoe_size
,类型是u32
,最后返回一个Vec<Shoe>
。
函数体里先把传进来的Vector
调用into_iter
方法创建一个获得了所有权的迭代器。
然后使用了filter
方法,其参数是一个闭包,这个闭包通过size
字段判断每个元素的尺码是否符合shoe_size
一样,如果相等,这个元素就会包含在新生成的迭代器里。
最后调用collect
方法把它变成一个集合返回。