Vector 尝试使用高阶函数用对象填充锈蚀向量

Vector 尝试使用高阶函数用对象填充锈蚀向量,vector,iterator,rust,Vector,Iterator,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&g

我可以创建一个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);
}
#[派生(调试)]
发布结构模拟{
id:i32,
}
sim卡的impl默认值{
fn default()->sim{
sim{id:4}
}
}
fn main(){
让mut v2=Vec:::new();
因为我在0..7{
v2.推送(sim::default())
}
println!(“{:?}”,v2);
}
我尝试了下面的代码,但没有成功

let mut v3 = Vec::<sim>::new();
(0..7).map(|| v3.push(sim::default()));
let mut v3=Vec:::new();
(0..7).map(| | v3.push(sim::default());

你眼前的问题是:
map
根本不是这样工作的。映射涉及获取一个序列,并转换所述序列中的每个元素,生成一个新序列。出于两个原因,您不应该仅使用它来执行副作用:

  • 没有人会期望您这样做,因此您的代码将比其他阅读它的人更容易混淆

  • Rust中的迭代器是惰性计算的,这意味着除非使用映射的迭代器,否则不会发生任何事情

  • 如果你真的想做7次某件事,就用一个循环。这就是他们的目的。如果你真的非常迫切地需要做这样的事情,板条箱有一个
    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();
    }
    
    #[派生(克隆、调试)]
    发布结构模拟{
    id:i32,
    }
    Sim卡的impl默认值{
    fn default()->Sim{
    Sim{id:4}
    }
    }
    fn main(){
    使用std::iter;
    设v1=vec![Sim::default();7];
    让v2:Vec=iter::repeat(Sim::default()).take(7.collect();
    让v3:Vec=(0..7).map(| | Sim::default()).collect();
    让v4:Vec=iter::once(Sim::default()).cycle().take(7.collect();
    }
    

    可能还有更多。请注意,
    v1
    v2
    v4
    要求项目类型为
    Clone
    ,以便可以进行复制。

    请注意,惯用的生锈样式是对类型使用
    PascalCase
    sim
    不正确,
    sim
    将不正确。您也不需要在
    v2
    上提供类型提示-推送
    sim
    就足以推断类型。哈哈@Shepmaster谢谢。总有一天我会在这里把我的最简单的例子弄清楚;)这就是他们的目的-哦,我知道你在那里做了什么。很酷,这很有帮助。是的,我可以写一个循环,这是我第一次做的。我只是想了解rust中的高阶函数,并对它们更熟悉。谢谢你的想法,因为我自己也不会想到这些。