尝试使用更高阶函数

时间:2017-05-18 02:53:42

标签: 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>::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()));

1 个答案:

答案 0 :(得分:8)

您当前的问题是:map 。映射涉及采用序列并转换所述序列中的每个元素,产生新序列。你不应该使用它来执行副作用有两个原因:

  1. 没有人会期待你这样做,所以你的代码会比阅读它的人更容易混淆。

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

  3. 如果你真的想做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();
    }
    

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