请考虑以下代码
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字段.