以下代码未编译:
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我不明白为什么在这种情况下私人特质被认为被泄露了。
链接错误解释列出了类似的示例,这些示例通过在属性绑定中使用私有特征来泄漏私有特征。然而,这些例子是不同的,因为特征边界是外部板条箱可以使用的东西。
例如,我可以理解为什么这被认为是泄露了私有特性:
pub trait Public : Private {} // error: private trait in public interface在这里,外部板条箱需要实现私有特性(他们不能这样做)来实现公共特性(他们可以)。
我的第一个例子是不同的,因为外部的板条箱不需要知道任何关于私人特性的东西--所以我很困惑。
泄漏的规则在哪里被记录?泄露个人特质到底意味着什么?
为什么我的例子不能编译?有理由防范这样的impl吗?
发布于 2022-02-06 11:04:46
正如@茄子在评论中所解释的那样,尽管Public的用户不需要知道任何关于Private特性的信息,但文档仍然会泄露,其中必须包括impl块的头,以交流实现Public的类型。

解决办法是将Private特性标记为pub。如果您希望将它有效地保密,它可能仍然隐藏在私有mod中。
mod hidden {
pub trait Private {}
}
pub(crate) use hidden::Private;
pub trait Public {}
impl<T: Private> Public for T {}https://stackoverflow.com/questions/70986377
复制相似问题