@ -240,8 +240,8 @@ fn main() {
所以,如果我们想要让某一项可以在整个包中都可以被使用,那么有两种办法:
所以,如果我们想要让某一项可以在整个包中都可以被使用,那么有两种办法:
- 在包根中定义一个非 `pub` 类型的 `X` (父模块的项对子模块都是可见的,因此包根中的项对模块树上的所有模块都可见)
- 在顶层包 `crate` 中定义一个非 `pub` 类型的 `X` (父模块的项对子模块都是可见的,因此 `crate` ` 中的项对模块树上的所有模块都可见)
- 在子模块中定义一个 `pub` 类型的 `Y` ,同时通过 `use` 将其引入到包根
- 在子模块中定义一个 `pub` 类型的 `Y` ,同时通过 `use` 将其引入到顶层包 `crate`
```rust
```rust
mod a {
mod a {
@ -265,8 +265,10 @@ fn d() {
以上代码充分说明了之前两种办法的使用方式,但是有时我们会遇到这两种方法都不太好用的时候。例如希望对于某些特定的模块可见,但是对于其他模块又不可见:
以上代码充分说明了之前两种办法的使用方式,但是有时我们会遇到这两种方法都不太好用的时候。例如希望对于某些特定的模块可见,但是对于其他模块又不可见:
目标:模块 `a` 中导出常量 `I` 、函数 `bar()` 和 函数 `foo()` , 不导出子模块 `b` 、 `c` 和 `c` 中的常量 `J`
```rust
```rust
// 目标:`a` 导出 `I` 、`bar` and `foo` ,其他的不导出
pub mod a {
pub mod a {
pub const I: i32 = 3;
pub const I: i32 = 3;
@ -290,9 +292,9 @@ pub mod a {
}
}
```
```
这段代码会报错,因为与父模块中的项对子模块可见相反,子模块中的项对父模块是不可见的。这里 `semisecret ` 方法中,`a` -> `b` -> `c` 形成了父子模块链,那 `c` 中的 `J` 自然对 `a` 模块不可见。
这段代码会报错,因为与父模块中的项对子模块可见相反,子模块中的项对父模块是不可见的。这里 `semisecret () ` 方法中,`a` -> `b` -> `c` 形成了父子模块链,那 `c` 中的 `J` 自然对 `a` 模块不可见。
如果使用之前的可见性方式,那么想保持 `J` 私有,同时让 `a` 继续使用 `semisecret` 函数的办法是将该函数 移动到 `c` 模块中,然后用 `pub use` 将 `semisecret ` 函数进行再 导出:
如果使用之前的可见性方式,那么既保持 `J` 私有,又让 `a` 继续使用 `semisecret()` ,可以将 `semisecret()` 移动到 `c` 模块中,然后用 `pub use` 关键字 将 `semisecret () ` 导出:
```rust
```rust
pub mod a {
pub mod a {
@ -319,7 +321,7 @@ pub mod a {
}
}
```
```
这段代码说实话问题不大,但是有些破坏了我们之前的逻辑, 如果想保持代码逻辑,同时又只让 `J` 在 `a` 内可见该怎么办?
这段代码说实话问题不大,但是有些破坏了我们之前的逻辑。 如果想保持代码逻辑,同时又只让 `J` 在 `a` 内可见该怎么办?
```rust
```rust
pub mod a {
pub mod a {
@ -345,7 +347,7 @@ pub mod a {
}
}
```
```
通过 `pub(in crate::a)` 的方式,我们指定了模块 `c` 和常量 `J` 的可见范围都只是 `a` 模块中,`a` 之外的模块是完全访问不到它们的。
通过限制可见性范围 `pub(in crate::a)` 的方式,我们指定了模块 `c` 和常量 `J` 的可见范围都只是 `a` 模块中,`a` 之外的模块是完全访问不到它们的。
#### 限制可见性语法
#### 限制可见性语法
@ -468,4 +470,4 @@ fn main() {
## 课后练习
## 课后练习
> [Rust By Practice ](https://zh.practice.rs/crate-module/use-pub.html ),支持代码在线编辑和运行,并提供详细的[习题解答](https://github.com/sunface/rust-by-practice/blob/master/solutions/crate-module/use-pub.md)。
> [Rust By Practice ](https://zh.practice.rs/crate-module/use-pub.html ),支持代码在线编辑和运行,并提供详细的[习题解答](https://github.com/sunface/rust-by-practice/blob/master/solutions/crate-module/use-pub.md)。