繁体   English   中英

如何在 Rust 中隐藏特征实现

[英]How to hide trait implementation in Rust

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

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

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

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

问题是提到的 trait 实现暴露在我的 crate 之外。 我不希望我的箱子的用户意外地依赖从ForeignErrorTypeMyErrorType的转换可能性。

到目前为止我已经尝试过:已将提到的特征实现放入具有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM