获取已知数量的输入

Pio*_*_11 2 rust

我希望在 Rust 中获取已知数量的输入。在本例中,我正在考虑欧拉项目第 54 题的扑克手牌,其中每行解析为两手牌,每手牌五张。对于这种情况,我发现有两种主要方法,但我都不喜欢。

方法一:

let mut buffer_1 = Vec::with_capacity(5);
for i in 0..5 {
    buffer_1.push(i)
}
assert_eq!(buffer_1.len(), 5);
Run Code Online (Sandbox Code Playgroud)

方法2:

let mut buffer_2 = [None, 5];
for i in 0..5 {
    buffer_2[i as usize] = Some(i)
}
Run Code Online (Sandbox Code Playgroud)

尽管在编译时大小已知,但方法 1 位于堆上,而方法 2 为我提供了一个可选值,其中我知道所有内容都是Some. 我理想的情况是能够将某些函数或集合收集到数组或类似的数组中。例如

fn array_from_colsure<T>(length: usize, closure: fn() -> T) -> Option<[T; length]> {
    // implementation
}
#[test]
fn array_from_closure_test() {
    let a: [i32; 5] = array_from_colsure(5, || {for i in 0..5 {i}}).unwrap()
}
Run Code Online (Sandbox Code Playgroud)

澄清: 我希望找到具有此功能的东西,而不是从头开始创建它。

正如 Silvio Mayolo 的出色回答所示(自最初的问题以来,我对所需的功能进行了轻微的编辑),实现我的建议将需要大量的unsafe代码(更不用说为如此小的优化付出巨大的努力)。所以对于少数项目来说这样做是不明智的。

kmd*_*eko 5

您可以使用std::array::from_fn

let buffer: [i32; 5] = std::array::from_fn(|i| i as i32);
Run Code Online (Sandbox Code Playgroud)

我还提供了ArrayVecarrayvec或tinyvec板条箱这看起来像是您的第一种方法,但不会使用堆分配。