Update use.md (#1)

1. 这里包根使用 `crate` 而不使用 `src/lib.rs` ,主要考虑到与上一节内容的连贯性,这里使用 `src/lib.rs`  也不影响
2. 把代码里面的注释移到外面,并增加了对代码的层级结构的说明。本来打算替换到 a b c 这几个不是很直观的称呼,但是英语太差没找到合适的单词。
3. 我觉得将 `semisecret` 加上括号,能更直观看出来是一个方法
4. 修改了一些地方的,额,我个人觉得更好的描述方式
pull/1079/head
Kirin 3 years ago committed by GitHub
parent 212526cd31
commit d3d1364863
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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` 之外的模块是完全访问不到它们的。
#### 限制可见性语法
@ -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)。

Loading…
Cancel
Save