如何将 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>>
个实例中。
如果您是将其传递给函数的作者,也许可以使该函数在其错误参数上通用?如果它真的不关心错误的类型,这应该不会引起任何问题,否则您可能需要添加一些特征界限。
是否可以正确实现这个功能?
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>>
个实例中。
如果您是将其传递给函数的作者,也许可以使该函数在其错误参数上通用?如果它真的不关心错误的类型,这应该不会引起任何问题,否则您可能需要添加一些特征界限。