14、Visibility(可见性)

Visibility(可见性)

当你开始将代码分解成多个模块时,就需要开始考虑可见性问题。可见性决定了你的代码(或其他人的代码)中哪些区域可以访问给定的实体,无论是结构体、函数还是字段等。

默认私有

在 Rust 中,默认情况下一切都是私有的。 一个私有实体只能被访问于:

  1. 定义它的同一模块
  2. 其中一个子模块

在前面的练习中,我们已经广泛使用了这一功能。

  • create_todo_ticket 可以正常工作(一旦添加了use声明),因为 helpers 是根crate的子模块,而 Ticket 就定义在根crate中。因此,即使 Ticket 是私有的,create_todo_ticket也可以随意访问 Ticket(这属于第一条)。
  • 所有单元测试都是在他们所测试的代码子模块中被定义,所以它们可以不受限制的访问所有内容(这属于第二条)。

可见性修饰符

我们可以使用可见性修饰符来修改一个实体的默认的可见性。

以下是一些常见的可见性修饰符

  • pub:使实体变成public(公有),即可以从定义它的模块外部访问,可能从其他crate访问。
  • pub(crate):使实体在相同的crate中共有,但是不向外部公开。
  • pub(super):让实体在父模块中公开。
  • pub(in path::to::module):让实体在指定的模块中公开。

我们可以在模块,结构体,函数,字段等等上面使用可见性修饰符,比如:

pub struct Configuration {
    pub(crate) version: u32,
    active: bool,
}

Configurationpublic的,但是只能在同一crate内部访问version字段,activeprivate的,只能在同一模块或子模块中访问。

练习

这一节的练习有点抽象,没看懂……

image-20250902204250354

image-20250902204319513

我就把test.rs文件里面的那个代码注释掉,在lib.rs里面加上pub就结束了?

为什么要注释掉?

哦哦,想明白了,应该是里面的字段并没有设置pub属性,所以全都是私有的吧,然后就会报错……

那如果我全部改为公有呢?

image-20250902204535902

很显然没有报错了

image-20250902204559612

居然也通过了

image-20250902204629432

估计问题就在于只给外部的实体添加pub,里面的字段依然是private吧。

这次的练习应该就是这个意思,正好下一节要讲封装,这里可能就涉及到了我刚才的操作的简便解法吧。

以上就是这节的学习内容了,呼~

阅读剩余
THE END