Learning Rust With Entirely Too Many Linked Lists中,他们显示pub enum不能容纳私有struct:,

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,
}

这种差异的原因是什么?为什么私有枚举不会导致错误,而私有 struct 会导致错误?

推荐答案

在第一个示例中,enum List是公共的.这意味着enum变体More也是公共的.然而,More不能被外部代码使用,因为Node isn't是公共的.因此,你有一个外部可见的东西,但实际上不可能是used,这可能不是你想要的.

在第二个示例中, struct List是公共的.然而,head字段是not public.因此,Link是否公开并不重要,因为外部代码首先看不到head字段.

Rust相关问答推荐

为什么要在WASM库中查看Rust函数需要`#[no_mangle]`?

MutexGuard中的过滤载体不需要克隆

关于如何初始化弱 struct 字段的语法问题

定义采用更高级类型泛型的性状

带参考文献的 rust 元组解构

在Rust中判断编译时是否无法访问

如何将实现多个特征的 struct 传递给接受这些特征为&;mut?

获取已知数量的输入

如何重命名 clap_derive 中的子命令占位符?

Rust 中的复合 `HashSet` 操作或如何在 Rust 中获得 `HashSet` 的显式差异/并集

sha256 摘要仅适用于 &*

Rust中如何实现一个与Sized相反的负特性(Unsized)

从Rust 的临时文件中创建引用是什么意思?

在 Rust 中,Weak 如何知道内部值何时被删除?

仅在运行测试时生成调试输出

在 RefCell 上borrow

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

Rust 跨同一文件夹中文件的可见性

制作嵌套迭代器的迭代器

相互调用的递归异步函数:检测到循环