[英]How to hide trait implementation in Rust
我有一个项目有自己的错误类型,它暴露在 crate 之外。 让我们称之为MyErrorType
。 项目本身在内部依赖于另一个具有自己错误类型的 crate。 让我们称之为ForeignErrorType
。
为了简化代码并使其更具可读性,我创建了From特征的以下实现:
impl From<ForeignErrorType> for MyErrorType {
...
}
这允许使用问号运算符, ?
,在处理外来错误类型时,无需就地转换它们。
问题是提到的 trait 实现暴露在我的 crate 之外。 我不希望我的箱子的用户意外地依赖从ForeignErrorType
到MyErrorType
的转换可能性。
到目前为止我已经尝试过:已将提到的特征实现放入具有pub(crate)
可见性的模块中。 这令人惊讶地隐藏了此类模块中定义的所有struct
,但暴露了 trait 实现。
From
实现私有而不是将它暴露在 crate 之外??
操作员处理外国错误类型而不暴露它们?有没有办法让我的
From
实现私有而不是将它暴露在 crate 之外?
没有。特征实现没有 scope。
在这种情况下,您可以做的是编写一个 function ,其内容与您的From
实现的内容相同,然后在Result::map_err
之前应用它?
.
pub(crate) fn foreign_err(e: ForeignErrorType) -> MyErrorType {
todo!()
}
...
let foo = their_function().map_err(foreign_err)?;
这必须在每个?
用法,但是没有办法进行范围为 crate 或模块的隐式转换,所以这是你可以拥有的最好的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.