以下代码无法编译:
pub(crate) trait Private {}
pub trait Public {}
impl<T: Private> Public for T {}
错误是:
error[E0445]: private trait `Private` in public interface
--> src/main.rs:7:1
|
3 | pub(crate) trait Private {}
| ------------------------ `Private` declared as private
...
7 | impl<T: Private> Public for T {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
我不明白为什么在这种情况下 Private 特征被认为是泄露的。
linked error explanation列出了类似的示例,这些示例通过在特征绑定(bind)中使用私有(private)特征来泄漏它。但是,这些示例有所不同,因为特征边界是外部 crate 可以使用的东西。
例如,我可以理解为什么这被认为泄漏了 Private 特征:
pub trait Public : Private {} // error: private trait in public interface
在这里,外部 crate 需要实现 Private 特征(它们不能做到)才能实现 Public 特征(它们可以)。
我的第一个示例有所不同,因为外部 crate 不需要了解有关 Private 特征的任何信息 - 所以我很困惑。
泄露规则记录在哪里?泄露私有(private)特征到底意味着什么?
为什么我的示例无法编译?有理由防范这样的 impl
吗?
最佳答案
正如 @eggyal 在评论中解释的那样,即使 Public
的用户不需要了解任何有关 Private
特征的信息,它仍然通过文档泄露,其中必须包含 impl
block 的头部,以传达哪些类型实现 Public
。
解决方法是将 Private
特征标记为 pub
。如果您希望有效地保持私有(private),它可能仍然隐藏在私有(private) mod
中。
mod hidden {
pub trait Private {}
}
pub(crate) use hidden::Private;
pub trait Public {}
impl<T: Private> Public for T {}
关于rust - 为什么这个特征 `impl` 被认为泄漏了私有(private)特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70986377/