diff --git a/src/basic/crate-module/use.md b/src/basic/crate-module/use.md index 8ff5d9da..df76fd64 100644 --- a/src/basic/crate-module/use.md +++ b/src/basic/crate-module/use.md @@ -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)。 \ No newline at end of file +> [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)。