我正在寻求采取已知数量的投入铁 rust .在本例中,我将学习Euler项目的第54题的Flutter 克牌,其中每一行都解析成两手各有五张牌的牌.我发现有两种主要的方法来解决这种情况,这两种方法我都不喜欢.

方法1:

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

方法2:

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

尽管方法1在编译时有一个已知的大小,但是方法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()
}

Clarification:个 我希望找到这个功能的东西,而不是从头开始创建它.

正如西尔维奥·马约洛出色的回答所显示的(从最初的问题开始,我略微编辑了所需的功能),实现我的建议将需要惊人的unsafe个代码数量(更不用说如此小的优化需要付出巨大的努力).因此,为少数项目这样做是不明智的.

推荐答案

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

let buffer: [i32; 5] = std::array::from_fn(|i| i as i32);

我还提供了arrayvec个或tinyvec个 crate 中的ArrayVec个,这看起来像您的第一个方法,但不使用堆分配.

Rust相关问答推荐

为什么std repeat trait绑定在impl块和关联函数之间?

函数内模块的父作用域的访问类型

如何定义实现同名但返回类型不同的 struct 的函数

是否可以在不切换到下一个位置的情况下获得迭代器值:

如何迭代属性以判断相等性?

装箱特性如何影响传递给它的参数的生命周期 ?(举一个非常具体的例子)

这是什么:`impl Trait for T {}`?

`UnsafeCell` 在没有锁定的情况下跨线程共享 - 这可能会导致 UB,对吗?

需要哪些编译器优化来优化此递归调用?

为什么是&mut发送?线程如何在安全的 Rust 中捕获 &mut?

为什么我们有两种方法来包含 serde_derive?

如何为已实现其他相关 std trait 的每个类型实现一个 std Trait

Rust 打包在 .deb 中

没有得到无法返回引用局部变量`queues`的值返回引用当前函数拥有的数据的值的重复逻辑

在 Rust 中,Weak 如何知道内部值何时被删除?

仅在运行测试时生成调试输出

Rust 中 `Option` 的内存开销不是常量

你能告诉我如何在 Rust 中使用定时器吗?

是否有适当的方法在参考 1D 中转换 2D 数组

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?