行业资讯
【Rust自学】13.7. 迭代器 Pt.3:使用闭包捕获环境配合迭代器的使用
13.7 迭代器 Pt.3使用闭包捕获环境配合迭代器的使用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: VecShoe, shoe_size: u32) - VecShoe { 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类型是VecShoe另一个是shoe_size类型是u32最后返回一个VecShoe。函数体里先把传进来的Vector调用into_iter方法创建一个获得了所有权的迭代器。然后使用了filter方法其参数是一个闭包这个闭包通过size字段判断每个元素的尺码是否符合shoe_size一样如果相等这个元素就会包含在新生成的迭代器里。最后调用collect方法把它变成一个集合返回。
郑州网站建设
网页设计
企业官网