如何通过函数调用的结果的Ok值填充数组或返回Err?

时间:2019-05-29 13:59:57

标签: arrays rust initialization

考虑函数返回Result的情况:

fn might_explode() -> Result<AllFine, Kaboom> {
    // Awesome, potentially explosive things.
}

让我们假设我对AllFine毫无控制,也无法做出假设(例如,它来自另一个箱子)。我想做的是,如果可能,用迭代调用AllFine获得的值填充might_explode()的数组。如果对might_explode()的任何调用返回了Err,我想返回该Err

例如,如果我想构建一个包含四个元素的数组,我会这样做:

let my_array = [might_explode()?, might_explode()?, might_explode()?, might_explode()?]

上面的方法确实很好用,但是对于大型数组(我将使用例如多达256个元素的数组),它变得非常繁琐,并且(我猜?)它使生成的二进制文件非常膨胀。

四处寻找可能的解决方案,我偶然发现this beautiful post似乎完全可以满足我的需求。上面的帖子使用unsafe来举例说明:

let _: [Option<String>; 33] = unsafe {
    let mut arr: [Option<String>; 33] = std::mem::uninitialized();
    for item in &mut arr[..] {
        std::ptr::write(item, None);
    }
    arr
};

现在,如果只有might_explode()总是返回AllFine,这对我来说就是完美的。但是有时它可能返回Kaboom!结果,可能会在数组初始化过程中陷入困境,而返回时,我会在数组的每个未初始化元素上调用一个可能致命的drop

那么,有没有一种方法可以合理地使用unsafe来实现我想做的事情?

0 个答案:

没有答案