考虑以下代码
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,
}
出现这种差异的原因是什么?私有结构为什么私有枚举不会导致错误?
答案 0 :(得分:9)
在第一个示例中,i
是公开的。这意味着List
也是公开的。但是,外部代码无法使用More
,因为More
不是公共的。因此,你有一个外部可见的东西,但实际上不能使用,这可能不是你想要的。
在第二个示例中,Node
是公开的。但是,List
字段不是公开的。因此,head
是否公开并不重要,因为外部代码无法首先看到Link
字段。