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

Jal*_*Jal 6 rust

请考虑以下代码

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

pub enum List {
    Empty,
    More(Box<Node>),
}
Run Code Online (Sandbox Code Playgroud)

这会导致编译器抱怨:

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

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

pub struct List {
    head: Link,
}

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

struct Node {
    elem: i32,
    next: Link,
}
Run Code Online (Sandbox Code Playgroud)

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

DK.*_*DK. 10

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

在第二个例子中,List是公开的.但是,该head领域公开.因此,无论是否Link公开都无关紧要,因为外部代码无法首先看到该head字段.