尝试使用更高阶函数用对象填充Rust矢量

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)

DK.*_*DK. 9

您的直接问题是:是不是怎么map工作的根本.映射涉及采用序列并转换所述序列中的每个元素,产生新序列.您应该使用它来执行副作用有两个原因:

  1. 没有人会指望你这样做,所以你的代码会比阅读它的任何人都更加困惑.

  2. 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,v2v4要求的项目类型为Clone,以便它可以进行复印.

  • *这就是他们的“目的”*——哦,我明白你在那里做了什么。 (2认同)