我希望在 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
代码(更不用说为如此小的优化付出巨大的努力)。所以对于少数项目来说这样做是不明智的。
您可以使用std::array::from_fn
:
let buffer: [i32; 5] = std::array::from_fn(|i| i as i32);
Run Code Online (Sandbox Code Playgroud)
我还提供了ArrayVec
arrayvec或tinyvec板条箱,这看起来像是您的第一种方法,但不会使用堆分配。