考虑函数返回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
来实现我想做的事情?