kri*_*nab 2 iterator vector rust
我可以使用循环创建一个Rust向量并用struct实例填充它,但我想知道是否可以使用其中一个更高阶函数得到相同的结果map.
以下是一些有效的代码:
#[derive(Debug)]
pub struct sim {
id: i32,
}
impl Default for sim {
fn default() -> sim {
sim { id: 4 }
}
}
fn main() {
let mut v2 = Vec::<sim>::new();
for i in 0..7 {
v2.push(sim::default())
}
println!("{:?}", v2);
}
Run Code Online (Sandbox Code Playgroud)
我尝试了下面的代码,但它没有用.
let mut v3 = Vec::<sim>::new();
(0..7).map(|| v3.push(sim::default()));
Run Code Online (Sandbox Code Playgroud)
您的直接问题是:是不是怎么map工作的根本.映射涉及采用序列并转换所述序列中的每个元素,产生新序列.您不应该使用它来执行副作用有两个原因:
没有人会指望你这样做,所以你的代码会比阅读它的任何人都更加困惑.
Rust中的迭代器是懒惰计算的,这意味着除非使用映射的迭代器,否则不会发生任何事情.
如果你真的想做7次,只需使用一个循环.这就是他们的意思for.如果你真的,迫切需要做这样的事情,itertools箱子有一个foreach方法,这样做,同时仍然传达正在发生的事情.
至于如何使用更高阶函数实际构建集合......
#[derive(Clone, Debug)]
pub struct Sim {
id: i32,
}
impl Default for Sim {
fn default() -> Sim {
Sim { id: 4 }
}
}
fn main() {
use std::iter;
let v1 = vec![Sim::default(); 7];
let v2: Vec<_> = iter::repeat(Sim::default()).take(7).collect();
let v3: Vec<_> = (0..7).map(|_| Sim::default()).collect();
let v4: Vec<_> = iter::once(Sim::default()).cycle().take(7).collect();
}
Run Code Online (Sandbox Code Playgroud)
可能还有更多.需要注意的是v1,v2和v4要求的项目类型为Clone,以便它可以进行复印.
| 归档时间: |
|
| 查看次数: |
518 次 |
| 最近记录: |