如何在 Rust 中隐藏特征实现
How to hide trait implementation in Rust
我有一个项目,它有自己的错误类型,暴露在 crate 之外。让我们称之为 MyErrorType
。项目本身内部 依赖于另一个有自己的错误类型的板条箱。让我们称之为 ForeignErrorType
.
为了简化代码并使其更具可读性,我创建了以下 From 特征的实现:
impl From<ForeignErrorType> for MyErrorType {
...
}
这允许在处理外部错误类型时使用问号运算符 ?
,而无需就地转换它们。
问题是提到的特征实现暴露在我的板条箱之外。我不希望我的箱子的用户不小心依赖从 ForeignErrorType
到 MyErrorType
的转换可能性。
到目前为止我已经尝试过: 已将提到的特征实现放入具有 pub(crate)
可见性的模块中。这令人惊讶地隐藏了此类模块中定义的所有 struct
,但暴露了特征实现。
- 有没有办法让我的
From
实现保持私有而不将其暴露在 crate 之外?
- 可能我正在尝试以一种非惯用的方式实现错误处理的好处。如果这是真的,那么能够在不暴露外部错误类型的情况下对外部错误类型使用
?
运算符的正确方法是什么?
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)?;
这必须在每次 ?
使用时完成,但是没有办法进行作用域为板条箱或模块的隐式转换,所以这是最好的。
我有一个项目,它有自己的错误类型,暴露在 crate 之外。让我们称之为 MyErrorType
。项目本身内部 依赖于另一个有自己的错误类型的板条箱。让我们称之为 ForeignErrorType
.
为了简化代码并使其更具可读性,我创建了以下 From 特征的实现:
impl From<ForeignErrorType> for MyErrorType {
...
}
这允许在处理外部错误类型时使用问号运算符 ?
,而无需就地转换它们。
问题是提到的特征实现暴露在我的板条箱之外。我不希望我的箱子的用户不小心依赖从 ForeignErrorType
到 MyErrorType
的转换可能性。
到目前为止我已经尝试过: 已将提到的特征实现放入具有 pub(crate)
可见性的模块中。这令人惊讶地隐藏了此类模块中定义的所有 struct
,但暴露了特征实现。
- 有没有办法让我的
From
实现保持私有而不将其暴露在 crate 之外? - 可能我正在尝试以一种非惯用的方式实现错误处理的好处。如果这是真的,那么能够在不暴露外部错误类型的情况下对外部错误类型使用
?
运算符的正确方法是什么?
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)?;
这必须在每次 ?
使用时完成,但是没有办法进行作用域为板条箱或模块的隐式转换,所以这是最好的。