我可以使用循环创建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);
}
我尝试了下面的代码,但它没有用。
let mut v3 = Vec::<sim>::new();
(0..7).map(|| v3.push(sim::default()));
答案 0 :(得分:8)
您当前的问题是:map
。映射涉及采用序列并转换所述序列中的每个元素,产生新序列。你不应该使用它来执行副作用有两个原因:
没有人会期待你这样做,所以你的代码会比阅读它的人更容易混淆。
Rust中的迭代器是懒惰计算的,这意味着除非使用映射的迭代器,否则不会发生任何事情。
如果你真的想做7次,只需使用循环。那就是他们for
。如果你真的,绝望需要做这样的事情,itertools
crate有一个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();
}
可能还有更多。请注意,v1
,v2
和v4
要求项目类型为Clone
,以便它可以进行复制。