如何使用函数初始化数组?

use*_*580 8 arrays vector rust

我想在 Rust 中创建一个包含 10 个空向量的数组,但[Vec::new(); 10]由于Vec没有实现Copy. 我怎样才能做到这一点,更一般地说,我怎样才能通过重复调用一个函数来初始化一个数组?

aed*_*edm 12

从 Rust 1.63 开始

使用from_fn

let array: [usize; 5] = core::array::from_fn(|i| i * 2);
assert_eq!(array, [0, 2, 4, 8, 10]);
Run Code Online (Sandbox Code Playgroud)


Min*_*uel 10

截至 2021 年 9 月 Rust 1.55.0

您可以将数组的.map()方法用于一般函数:

let arr: [Vec<u32>; 10] = [(); 10].map(|_| Vec::with_capacity(100));
Run Code Online (Sandbox Code Playgroud)

(对于 Rust 1.63.0,2022 年 8 月,请考虑使用from_fn)。


She*_*ter 5

对于您的具体情况,您可以使用Default

let v: [Vec<String>; 10] = Default::default();
Run Code Online (Sandbox Code Playgroud)

对于一般情况,您可以从函数中创建一个迭代器,然后使用以下方法收集到数组中ArrayVec

use arrayvec::ArrayVec; // 0.4.10
use std::iter;

fn make<R>(f: impl FnMut() -> R) -> [R; 10] {
    let a: ArrayVec<_> = iter::repeat_with(f).collect();
    a.into_inner()
        .unwrap_or_else(|_| panic!("Did not have enough elements"))
}

fn main() {
    let mut a = 0;
    let arr = make(|| {
        a += 3;
        a
    });

    println!("{:?}", arr);
    // [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:


归档时间:

查看次数:

2870 次

最近记录:

5 年,7 月 前