Merge pull request #229 from spartucus/master

several refactors
pull/232/head
KaiserY 6 years ago committed by GitHub
commit db7fc4aa4d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -2,11 +2,11 @@
> [ch07-00-modules.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch07-00-modules.md)
> <br>
> commit a0b6dd108ac3896a771c1f6d74b2cd906b8bce19
> commit 050ff6f34f107b2c8695807fc16aeb827ffe1fa3
在你刚开始编写 Rust 程序时,代码可能仅仅位于 `main` 函数中。随着代码量的增长,为了复用和更好地组织代码,最终你会将功能移动到其他函数中。通过将代码分隔成更小的块每一个块代码自身就更易于理解。不过当你发现自己有太多的函数了该怎么办呢Rust 有一个模块系统可以有组织地复用代码。
在你刚开始编写 Rust 程序时,代码可能仅仅位于 `main` 函数中。随着代码量的增长,为了复用和更好地组织代码,最终你会将功能移动到其他函数中。通过将代码拆分成更小的块每一个块就更易于理解。但是如果你有太多的函数该怎么办呢Rust 有一个模块系统,可以有组织地复用代码。
就跟你将代码行提取到一个函数中一样,也可以将函数(和其他类似结构体和枚举的代码)提取到不同模块中。**模块***module*)是一个包含函数或类型定义的命名空间,你可以选择这些定义能(公有)或不能(私有)在其模块外可见。下面是一个模块如何工作的梗概:
就跟你将代码行提取到一个函数中一样,也可以将函数(和其他代码,例如结构体和枚举)提取到不同模块中。**模块***module*)是一个包含函数或类型定义的命名空间,你可以选择这些定义能(公有)或不能(私有)在其模块外可见。下面是一个模块如何工作的梗概:
* 使用 `mod` 关键字声明新模块。此模块中的代码要么直接位于声明之后的大括号中,要么位于另一个文件。
* 函数、类型、常量和模块默认都是私有的。可以使用 `pub` 关键字将其变成公有并在其命名空间之外可见。

@ -6,7 +6,7 @@
我们将通过使用 Cargo 创建一个新项目来开始我们的模块之旅,不过这次不再创建一个二进制 crate而是创建一个库 crate一个其他人可以作为依赖导入的项目。第二章猜猜看游戏中作为依赖使用的 `rand` 就是这样的 crate。
我们将创建一个提供一些通用网络功能的项目的骨架结构;我们将专注于模块和函数的组织,而不担心函数体中的具体代码。这个项目叫做 `communicator`。若要创建一个库,应当使用 `--lib` 参数而不是之前所用的 `--bin` 参数:
我们将创建一个库的框架,提供一些通用网络功能;我们将专注于模块和函数的组织,而不担心函数体中的具体代码。这个项目叫做 `communicator`。若要创建一个库,应当使用 `--lib` 参数而不是之前所用的 `--bin` 参数:
```text
$ cargo new communicator --lib
@ -29,7 +29,7 @@ mod tests {
Cargo 创建了一个空的测试来帮助我们开始库项目,不像使用 `--bin` 参数那样创建一个 “Hello, world!” 二进制项目。在本章之后的 “使用 `super` 访问父模块” 部分会介绍 `#[]``mod tests` 语法,目前只需确保它们位于 *src/lib.rs* 底部即可。
因为没有 *src/main.rs* 文件,所以没有可供 Cargo 的 `cargo run` 执行的东西。因此,我们将使用 `cargo build` 命令只是编译库 crate 的代码。
因为没有 *src/main.rs* 文件,所以没有可供 Cargo 的 `cargo run` 执行的东西。因此,我们将使用 `cargo build` 命令编译库 crate 的代码。
我们将学习根据编写代码的意图来以不同方法组织库项目代码以适应多种情况。
@ -183,7 +183,7 @@ fn connect() {
Rust 默认只知道 *src/lib.rs* 中的内容。如果想要对项目加入更多文件,我们需要在 *src/lib.rs* 中告诉 Rust 去寻找其他文件;这就是为什么 `mod client` 需要被定义在 *src/lib.rs* 而不能在 *src/client.rs* 的原因。
现在,一切应该能成功编译,虽然会有一些警告。记住使用 `cargo build` 而不是 `cargo run` 因为这是一个库 crate 而不是二进制 crate
现在,一切应该能成功编译,虽然会有一些警告。记住使用 `cargo build` 而不是 `cargo run` 因为这是一个库 crate 而不是二进制 crate
```text
$ cargo build

@ -2,7 +2,7 @@
> [ch07-02-controlling-visibility-with-pub.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch07-02-controlling-visibility-with-pub.md)
> <br>
> commit 478fa6f92b6e7975f5e4da8a84a498fb873b937d
> commit a120c730714e07f8f32d905e9374a50b2e0ffdf5
我们通过将 `network``network::server` 的代码分别移动到 *src/network/mod.rs**src/network/server.rs* 文件中解决了示例 7-5 中出现的错误信息。现在,`cargo build` 能够构建我们的项目,不过仍然有一些警告信息,表示 `client::connect`、`network::connect` 和`network::server::connect` 函数没有被使用:
@ -45,7 +45,7 @@ fn main() {
}
```
使用 `extern crate` 指令将 `communicator` 库 crate 引入到作用域。我们的包现在包含 **两个** crate。Cargo 认为 *src/main.rs* 是一个二进制 crate 的根文件,与现存的以 *src/lib.rs* 为根文件的库 crate 相区分。这个模式在可执行项目中非常常见:大部分功能位于库 crate 中,而二进制 crate 使用这个库 crate。通过这种方式其他程序也可以使用这个库 crate这是一个很好的关注分离separation of concerns
使用 `extern crate` 指令将 `communicator` 库 crate 引入到作用域。我们的包现在包含 **两个** crate。Cargo 认为 *src/main.rs* 是一个二进制 crate 的根文件,与现存的以 *src/lib.rs* 为根文件的库 crate 相区分。这个模式在可执行项目中非常常见:大部分功能位于库 crate 中,而二进制 crate 使用库 crate。通过这种方式其他程序也可以使用这个库 crate这是一个很好的关注分离separation of concerns
从一个外部 crate 的视角观察 `communicator` 库的内部,我们创建的所有模块都位于一个与 crate 同名的模块内部,`communicator`。这个顶层的模块被称为 crate 的 **根模块***root module*)。

Loading…
Cancel
Save