|
|
|
@ -240,8 +240,8 @@ fn main() {
|
|
|
|
|
|
|
|
|
|
所以,如果我们想要让某一项可以在整个包中都可以被使用,那么有两种办法:
|
|
|
|
|
|
|
|
|
|
- 在包根中定义一个非 `pub` 类型的 `X`(父模块的项对子模块都是可见的,因此包根中的项对模块树上的所有模块都可见)
|
|
|
|
|
- 在子模块中定义一个 `pub` 类型的 `Y`,同时通过 `use` 将其引入到包根
|
|
|
|
|
- 在顶层包 `crate` 中定义一个非 `pub` 类型的 `X`(父模块的项对子模块都是可见的,因此 `crate`` 中的项对模块树上的所有模块都可见)
|
|
|
|
|
- 在子模块中定义一个 `pub` 类型的 `Y`,同时通过 `use` 将其引入到顶层包 `crate`
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
mod a {
|
|
|
|
@ -265,8 +265,10 @@ fn d() {
|
|
|
|
|
|
|
|
|
|
以上代码充分说明了之前两种办法的使用方式,但是有时我们会遇到这两种方法都不太好用的时候。例如希望对于某些特定的模块可见,但是对于其他模块又不可见:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
目标:模块 `a` 中导出常量 `I`、函数 `bar()` 和 函数 `foo()`, 不导出子模块 `b` 、 `c` 和 `c` 中的常量 `J`
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
// 目标:`a` 导出 `I`、`bar` and `foo`,其他的不导出
|
|
|
|
|
pub mod a {
|
|
|
|
|
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
|
|
|
|
|
pub mod a {
|
|
|
|
@ -319,7 +321,7 @@ pub mod a {
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这段代码说实话问题不大,但是有些破坏了我们之前的逻辑,如果想保持代码逻辑,同时又只让 `J` 在 `a` 内可见该怎么办?
|
|
|
|
|
这段代码说实话问题不大,但是有些破坏了我们之前的逻辑。如果想保持代码逻辑,同时又只让 `J` 在 `a` 内可见该怎么办?
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
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` 之外的模块是完全访问不到它们的。
|
|
|
|
|
|
|
|
|
|
#### 限制可见性语法
|
|
|
|
|
|
|
|
|
|