如何将 Arc<Result<T, E>> 变成 Arc<Option<T>>?

How can I turn an Arc<Result<T, E>> into an Arc<Option<T>>?

是否可以正确实现这个功能?

        fn ok<T, E>(arc: Arc<Result<T, E>>) -> Arc<Result<T, ()>> {
            // ?
        }

我的用例是我想将 Result 传递给一个不知道或不关心结果错误类型的函数。这似乎是 result.ok() 的主要用例,但我无法让它为 Arc 工作。任何取消引用弧并重新打包其 T 的尝试都会(可以理解地)导致 cannot move out of Arc 编译器错误。

更新:希望在不克隆基础数据的情况下做到这一点。

Arc 提供“共享所有权”,即它允许多个位置保存某些数据,而不受任何特定堆栈框架生命周期的限制。

简而言之,是的,可以这样做,但是您需要克隆基础数据,例如:

fn convert<T: Clone, E: Clone>(arc: Arc<Result<T, E>>) -> Arc<Option<T>> {
    // explicit types added for clarity
    let result: &Result<T, E> = arc.as_ref();
    let cloned_result: Result<T, E> = Result::clone(result);
    Arc::new(cloned_result.ok())
}

但这可能不是您想要的,因为这些 Arc 现在指向不同的基础数据;对 Arc<Result<T, E>> 个实例的更改不会反映在 Arc<Option<T>> 个实例中。

如果您是将其传递给函数的作者,也许可以使该函数在其错误参数上通用?如果它真的不关心错误的类型,这应该不会引起任何问题,否则您可能需要添加一些特征界限。