首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这种“隐含”被认为泄露了一个私人的特征?

为什么这种“隐含”被认为泄露了一个私人的特征?
EN

Stack Overflow用户
提问于 2022-02-04 12:25:38
回答 1查看 326关注 0票数 2

以下代码未编译:

代码语言:javascript
复制
pub(crate) trait Private {}

pub trait Public {}

impl<T: Private> Public for T {}

错误是:

代码语言:javascript
复制
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

我不明白为什么在这种情况下私人特质被认为被泄露了。

链接错误解释列出了类似的示例,这些示例通过在属性绑定中使用私有特征来泄漏私有特征。然而,这些例子是不同的,因为特征边界是外部板条箱可以使用的东西。

例如,我可以理解为什么这被认为是泄露了私有特性:

代码语言:javascript
复制
pub trait Public : Private {} // error: private trait in public interface

在这里,外部板条箱需要实现私有特性(他们不能这样做)来实现公共特性(他们可以)。

我的第一个例子是不同的,因为外部的板条箱不需要知道任何关于私人特性的东西--所以我很困惑。

泄漏的规则在哪里被记录?泄露个人特质到底意味着什么?

为什么我的例子不能编译?有理由防范这样的impl吗?

EN

回答 1

Stack Overflow用户

发布于 2022-02-06 11:04:46

正如@茄子在评论中所解释的那样,尽管Public的用户不需要知道任何关于Private特性的信息,但文档仍然会泄露,其中必须包括impl块的头,以交流实现Public的类型。

解决办法是将Private特性标记为pub。如果您希望将它有效地保密,它可能仍然隐藏在私有mod中。

代码语言:javascript
复制
mod hidden {
    pub trait Private {}
}

pub(crate) use hidden::Private;

pub trait Public {}

impl<T: Private> Public for T {}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70986377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档