为什么“不能泄漏私人类型”只适用于结构而不是枚举?

时间:2017-10-11 04:50:31

标签: rust

考虑以下代码

struct Node {
    elem: i32,
    next: List,
}

pub enum List {
    Empty,
    More(Box<Node>),
}

这会导致编译器抱怨:

error[E0446]: private type `Node` in public interface
 --> src/main.rs:8:10
  |
8 |     More(Box<Node>),
  |          ^^^^^^^^^^ can't leak private type

但即使Link是私有的,此代码也不会导致错误:

pub struct List {
    head: Link,
}

enum Link {
    Empty,
    More(Box<Node>),
}

struct Node {
    elem: i32,
    next: Link,
}

出现这种差异的原因是什么?私有结构为什么私有枚举不会导致错误?

1 个答案:

答案 0 :(得分:9)

在第一个示例中,i是公开的。这意味着List也是公开的。但是,外部代码无法使用More,因为More 不是公共的。因此,你有一个外部可见的东西,但实际上不能使用,这可能不是你想要的。

在第二个示例中,Node是公开的。但是,List字段是公开的。因此,head是否公开并不重要,因为外部代码无法首先看到Link字段。