如何在 Rust 中隐藏特征实现

How to hide trait implementation in Rust

我有一个项目,它有自己的错误类型,暴露在 crate 之外。让我们称之为 MyErrorType。项目本身内部 依赖于另一个有自己的错误类型的板条箱。让我们称之为 ForeignErrorType.

为了简化代码并使其更具可读性,我创建了以下 From 特征的实现:

impl From<ForeignErrorType> for MyErrorType {
   ...
}

这允许在处理外部错误类型时使用问号运算符 ?,而无需就地转换它们。

问题是提到的特征实现暴露在我的板条箱之外。我不希望我的箱子的用户不小心依赖从 ForeignErrorTypeMyErrorType 的转换可能性。

到目前为止我已经尝试过: 已将提到的特征实现放入具有 pub(crate) 可见性的模块中。这令人惊讶地隐藏了此类模块中定义的所有 struct,但暴露了特征实现。

Is there way to keep my From implementation private and not to expose it outside of crate?

没有。特征实现没有作用域。

在这种情况下,您可以做的是编写一个与您的 From 实现具有相同内容的函数,并在 ? 之前用 Result::map_err 应用它。

pub(crate) fn foreign_err(e: ForeignErrorType) -> MyErrorType {
    todo!()
}

...

let foo = their_function().map_err(foreign_err)?;

这必须在每次 ? 使用时完成,但是没有办法进行作用域为板条箱或模块的隐式转换,所以这是最好的。