rust - 为什么这个特征 `impl` 被认为泄漏了私有(private)特征?

标签 rust interface private public

以下代码无法编译:

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

Documentation for 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/

相关文章:

.net - 将 .Net 类公开给 COM,同时它具有私有(private)泛型类型成员

java - 如何从java中的其他类访问私有(private)类内部声明的变量?

rust - 使用 const 通过强制转换来计算其他 const 表达式

Objective-C:为什么接口(interface)类型不能静态分配?

rust - 比 thread_local 更有效的替代方案!和lazy_static?

java - 使用 Java 连接到 SOAP UI Mock Web 服务

java - 如何返回类型接口(interface)

Ruby 私有(private)实例变量,有异常(exception)

rust - 无法在 Mac m1 上遵循紫杉教程 - 使用未声明的类型 `Vec`

multithreading - 如何控制 Rust 中 2 个不同线程的打印顺序