网站建设服务哪家便宜,券多多是谁做的网站,广州网站开发外包,软件项目实施计划方案目录 rust中迭代器的使用#xff08;iter().map()与for循环的区别#xff09;map()与for的描述区别总结 最后更新时间2024-05-24 rust中迭代器的使用#xff08;iter().map()与for循环的区别#xff09;
map()与for的描述
rust源码中关于iter().map()函数的解释#xff… 目录 rust中迭代器的使用iter().map()与for循环的区别map()与for的描述区别总结 最后更新时间2024-05-24 rust中迭代器的使用iter().map()与for循环的区别
map()与for的描述
rust源码中关于iter().map()函数的解释
// core::iter::traits::iterator::Iterator/// Takes a closure and creates an iterator which calls that closure on each/// element.////// map() transforms one iterator into another, by means of its argument:/// something that implements [FnMut]. It produces a new iterator which/// calls this closure on each element of the original iterator.////// If you are good at thinking in types, you can think of map() like this:/// If you have an iterator that gives you elements of some type A, and/// you want an iterator of some other type B, you can use map(),/// passing a closure that takes an A and returns a B.////// map() is conceptually similar to a [for] loop. However, as map() is/// lazy, it is best used when youre already working with other iterators./// If youre doing some sort of looping for a side effect, its considered/// more idiomatic to use [for] than map().////// [for]: ../../book/ch03-05-control-flow.html#looping-through-a-collection-with-for////// # Examples////// Basic usage:////// /// let a [1, 2, 3];////// let mut iter a.iter().map(|x| 2 * x);////// assert_eq!(iter.next(), Some(2));/// assert_eq!(iter.next(), Some(4));/// assert_eq!(iter.next(), Some(6));/// assert_eq!(iter.next(), None);/// ////// If youre doing some sort of side effect, prefer [for] to map():////// /// # #![allow(unused_must_use)]/// // dont do this:/// (0..5).map(|x| println!({x}));////// // it wont even execute, as it is lazy. Rust will warn you about this.////// // Instead, use for:/// for x in 0..5 {/// println!({x});/// }/// fn mapB, F(self, f: F) - MapSelf, FwhereSelf: Sized,F: FnMut(Self::Item) - B,{Map::new(self, f)}上述官方解释比较难以理解这里解释一下官方的解释 iter().map()和for循环都是用来遍历集合如Vec、数组或其他迭代器的常用方法但它们在使用场景、目的和返回值方面有所不同。
iter().map() iter().map()是Rust标准库提供的迭代器适配器方法之一用于对集合中的每个元素应用一个函数生成一个新的迭代器该迭代器产生的是原函数应用结果的序列。它主要用于数据转换且不会修改原集合。map操作是惰性的即直到你通过collect()、for_each()等方法消费这个新迭代器时转换操作才真正执行。 示例
let numbers vec![1, 2, 3, 4];
let doubled: Veci32 numbers.iter().map(|x| x * 2).collect();
// doubled 现在是 vec![2, 4, 6, 8]for循环 for循环则是一种更通用的迭代结构它可以遍历任何实现了IntoIterator特质的集合。for循环允许你对集合中的每个元素执行一系列操作这些操作可以是任意的包括打印、修改集合内容、计算某个值或调用函数等。与map()不同for循环通常用于有副作用的操作或者当不需要保留转换结果时。 示例
let mut numbers vec![1, 2, 3, 4];
for num in mut numbers {*num * 2;
}
// numbers 现在是 vec![2, 4, 6, 8]区别
目的 iter().map()主要用于无副作用的数据转换并生成新的数据序列而for循环适用于任何需要遍历并可能带有副作用操作的场景。 返回值 map返回一个新的迭代器其中包含转换后的值for循环没有直接返回值主要用于执行过程中的操作。 惰性与立即执行 map是惰性的需要进一步的动作如collect来实际执行转换for循环则是立即执行的。 修改原集合 map不修改原集合而for循环可以通过可变引用修改集合内容。 选择哪种方式取决于你的具体需求是否需要保留原集合、是否需要进行数据转换、以及是否执行有副作用的操作。
总结
iter().map() 主要用于将数据集中的每个元素转换为另一个形式创建出一个新的数据集不改变原数据适用于无副作用的数据转换场景。比如将一个整数集合转换为对应的字符串集合或对每个元素应用某种计算规则得到新的值并创建新的集合。
for 循环则更加灵活既可以用作简单的遍历查看元素也可以用来直接修改原数据集中的元素。当你需要对集合中的每个元素执行可能包含副作用的操作如修改元素、打印输出、基于当前元素影响外部状态等时for循环是更合适的选择。