diff --git a/projects/cargo_features_demo/Cargo.toml b/projects/cargo_features_demo/Cargo.toml
deleted file mode 100644
index 2a540a2..0000000
--- a/projects/cargo_features_demo/Cargo.toml
+++ /dev/null
@@ -1,9 +0,0 @@
-[package]
-name = "cargo_features_demo"
-version = "0.1.0"
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-art = { path = "../art" }
diff --git a/projects/cargo_features_demo/src/lib.rs b/projects/cargo_features_demo/src/lib.rs
deleted file mode 100644
index d04cdb7..0000000
--- a/projects/cargo_features_demo/src/lib.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-//! # Cargo 特性示例代码箱
-//!
-//! `cargo_features_demo` 是令到执行某些确切计算更便利
-//! 的一些工具的集合。
-//!
-
-/// 将一加到所给数字。
-/// # Examples
-///
-/// ```
-/// let arg = 5;
-/// let answer = cargo_features_demo::add_one(arg);
-///
-/// assert_eq! (7, answer);
-/// ```
-pub fn add_one(x: i32) -> i32 {
- x + 2
-}
-
-#[cfg(test)]
-mod tests;
diff --git a/projects/cargo_features_demo/src/main.rs b/projects/cargo_features_demo/src/main.rs
deleted file mode 100644
index 170a783..0000000
--- a/projects/cargo_features_demo/src/main.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use art::mix;
-use art::PrimaryColor;
-
-fn main() {
- let red = PrimaryColor::Red;
- let yellow = PrimaryColor::Yellow;
- mix(red, yellow);
-}
diff --git a/projects/cargo_features_demo/src/tests.rs b/projects/cargo_features_demo/src/tests.rs
deleted file mode 100644
index b65c49d..0000000
--- a/projects/cargo_features_demo/src/tests.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-use super::*;
-
-#[test]
-fn five_plus_one() {
- assert_eq! (7, add_one(5));
-}
diff --git a/projects/my_crate/Cargo.toml b/projects/my_crate/Cargo.toml
new file mode 100644
index 0000000..60664c6
--- /dev/null
+++ b/projects/my_crate/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "my_crate"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
diff --git a/projects/my_crate/src/lib.rs b/projects/my_crate/src/lib.rs
new file mode 100644
index 0000000..8fb5f78
--- /dev/null
+++ b/projects/my_crate/src/lib.rs
@@ -0,0 +1,18 @@
+//! # 我的代码箱
+//!
+//! `my_crate` 是个实用工具集,旨在让执行
+//! 某些计算更加便捷。
+
+/// 加一到给定的数字。
+///
+/// # Examples
+///
+/// ```
+/// let arg = 5;
+/// let answer = my_crate::add_one(arg);
+///
+/// assert_eq! (7, answer);
+/// ```
+pub fn add_one(x: i32) -> i32 {
+ x + 1
+}
diff --git a/src/crates-io/publishing.md b/src/crates-io/publishing.md
index ed33ccd..6459d65 100644
--- a/src/crates-io/publishing.md
+++ b/src/crates-io/publishing.md
@@ -1,25 +1,27 @@
# 发布代码箱到 Crates.io
-咱们已将 [crates.io](https://crates.io) 上的包用作过咱们项目的依赖项,但咱们也可以通过发布咱们自己的包,与其他人分享自己的代码。位于 [crates.io](https://crates.io) 网站的代码箱登记簿,会分发咱们包的源码,因此他主要托管开源代码。
+我们已将 [crates.io](https://crates.io) 上的包用作过项目的依赖项,但我们也可以通过发布咱们自己的包,与其他人分享自己的代码。位于 [crates.io](https://crates.io) 网站的代码箱登记簿,会分发咱们包的源码,因此他主要托管开源代码。
-Rust 与 Cargo 都有着一些让咱们发布的包,更容易被人们找到并使用的特性。接下来我们将讨论其中一些特性,然后讲解怎样发布包。
+Rust 与 Cargo 都有着一些让我们发布的包,更容易被人们找到并使用的特性。接下来我们将讨论其中一些特性,然后讲解怎样发布包。
## 制作有用的文档注释
-准确地为咱们的包编写文档,将帮助到其他使用者获悉怎样及何时来使用他们,因此投入时间来编写文档是值得的。第 3 章中,咱们曾讨论过如何使用双斜杠 `//`来注释 Rust 代码。Rust 还有用于文档的一种将生成 HTML 文档的特殊注释,而被方便地称作 *文档注释,documentation comment*。这些 HTML 会显示出公开 API 项目的文档注释内容,这些内容是为对了解怎样 *使用,use* 咱们的代码箱,而非咱们代码箱如何实现感兴趣的程序员所准备的。
+准确地为咱们的包编写文档,将帮助到其他用户了解怎样及何时来使用他们,因此投入时间编写文档是非常值得的。在第 3 章中,我们讨论过怎样使用双斜杠 `//` 来注释 Rust 代码。Rust 还有针对文档的一种特别注释,通常称为 *文档注释,documentation comment*,将生成 HTML 文档。生成的 HTML 会显示针对公开 API 项目的文档注释内容,是为有兴趣了解怎样 *使用* 咱们的代码箱,而不是对其 *实现* 感兴趣的程序员准确的。
-文档注释用的是三斜杠 `///` 而非双斜杠,并支持用于格式化文本的 Markdown 写法。要把文档注释恰好放在他们要注释的项目前,而紧接着注释项目。下面清单 14-1 给出了名为 `cargo_features_demo` 代码箱中,`add_one` 函数的文档注释。
+文档注释使用三斜杠 `///` 而非双斜杠,并支持 Markdown 表示法来格式化文本。要放置文档注释于他们说明的项目正上方。下面清单 14-1 展示了名为 `my_crate` 的代码箱中 `add_one` 函数的文档注释。
+
文件名:`src/lib.rs`
~~~rust
-/// 将一加到所给数字。
+/// 加一到给定的数字。
+///
/// # Examples
///
/// ```
/// let arg = 5;
-/// let answer = cargo_features_demo::add_one(arg);
+/// let answer = my_crate::add_one(arg);
///
/// assert_eq! (6, answer);
/// ```
@@ -28,106 +30,97 @@ pub fn add_one(x: i32) -> i32 {
}
~~~
-*清单 14-1:函数的文档注释*
+**清单 14-1**:函数的文档注释
-这里,咱们给到了 `add_one` 函数完成什么的描述,以标题 `Examples` 开始了一个小节,并随后提供了演示怎样使用 `add_one` 函数的代码。咱们可通过运行 `cargo doc` 命令,生成文档注释的 HTML 文档。这个命令会运行与 Rust 一起分发的 `rustdoc` 工具,并将生成的 HTML 文档放在 `target/doc` 目录中。
+在这里,我们描述了 `add_one` 函数执行的操作,以标题 `Examples` 开始了一个小节,然后提供了演示怎样使用 `add_one` 函数的代码。我们可以通过运行 `cargo doc` 从这一文档注释生成 HTML 文档。这条命令运行随 Rust 一起分发的 `rustdoc` 工具,并放置生成的 HTML 文档于 `target/doc` 目录中。
-处于便利目的,运行 `cargo doc --open` 将构建出当前代码箱文档(以及咱们代码箱全部依赖的文档)的 HTML,并随后在 web 浏览器中打开得到的结果。导航到那个 `add_one` 函数,咱们将看到文档注释中的文本如何渲染出来,如下图片 14-01 中所示:
+出于便利目的,运行 `cargo doc --open` 将针对咱们的当前代码箱的文档(以及所有咱们的代码箱的依赖项的文档)构建 HTML,并在 web 浏览器中打开结果。导航到 `add_one` 函数,咱们将看到文档注释中的文本是如何渲染的,如下图 14-01 中所示:
+

-*图 14-01:`add_one` 函数的 HTML 文档*
+**图 14-1**:`add_one` 函数的 HTML 文档
-### 经常用到的小节
+### 常用小节
-**Commonly Used Sections**
+我们在清单 14-1 中使用了 `# Examples` 这个 Markdown 标题,以标题 “Examples” 创建了 HTML 中的一个小节。以下是代码箱作者在他们的文档中常用的一些别的小节:
+- `# Panics`:这些属于被文档注释的函数可能终止运行的情形。不希望他们的程序终止运行的调用者,应确保在这些情形下不要调用该函数;
+- `# Errors`:当函数返回一个 `Result` 时,描述可能发生的错误类别以及可能导致返回这些错误的条件,会对调用者很有帮助,以便他们可以编写以不同方式处理不同类别错误的代码;
+- `# Safety`:当函数的调用属于 `unsafe` (我们会在第 20 章讨论不安全)时,就应有一个小节解释为何该函数不安全,并涵盖该函数期望调用者遵守的不变量。
-咱们曾使用清单 14-1 中的 `# Examples` Markdown 标题,来创建出 HTML 中带有标题 “Examples” 的小节。下面是代码箱作者们,经常在他们文档中用到的一些其他小节:
-
-- **Panics**:被文档注释的函数可能终止运行的情形。那些不愿其程序终止运行的调用者,就应确保在这些情形下他们不会调用该函数;
-- **Errors**:若函数返回了 `Result`,那么描述出可能发生的各种错误,及何种条件下会造成那些错误的返回,就能有效帮助到调用者,从而他们可以编写出以不同方式,处理不同类别错误的代码;
-- **Safety**:若函数调用起来是 `unsafe` 的(在第 19 章咱们就会讨论到不安全),那么就应有一个解释为何该函数不安全,并说明该函数期望调用者要遵守哪些不变因素的小节,if the funciton is `unsafe` to call(we discuss unsafety in Chapter 19), there should be a section explaining why the function is unsafe and covering the invariants that the function expects callers to uphold。
-
-
-多数的文档注释并不需要全部这些小节,但这仍不失为一个提醒咱们,关于咱们代码使用者将有兴趣了解的各方面的一个良好检查单。
+大多数文档注释都不需要所有这些小节,但这是个很好的检查清单,可以提醒咱们代码使用者有兴趣了解的各方面。
### 作为测试的文档注释
-在文档注释中添加一些示例代码块,可以帮助演示怎样使用咱们的库,且这样做有着附带的好处,an additional bonus:运行 `cargo test` 将把文档中示例代码作为测试运行!带有示例的文档属实很好。而在文档编写好后,由于代码已被修改而造成示例不工作,也是极为糟糕的。当咱们以清单 14-1 中 `add_one` 函数的文档,运行 `cargo test`,就将在测试结果中看到这样一个小节:
+在文档注释中添加示例代码块,可以帮助演示怎样使用咱们的库,并且还有个额外的好处:运行 `cargo test` 将作为测试运行文档中的代码示例!没有什么比带有示例的文档更好的了。但最糟糕的也莫过于示例无法运行,只因文档编写后代码已被修改。当咱们对清单 14-1 中的 `add_one` 函数的文档运行 `cargo test` 时,我们将看到测试结果中下面这样的一个小节:
```console
- Doc-tests cargo_features_demo
+ Doc-tests my_crate
running 1 test
-test src/lib.rs - add_one (line 7) ... ok
+test src/lib.rs - add_one (line 5) ... ok
-test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
```
-现在当咱们修改那个函数或者那个示例,从而让示例中的 `assert_eq!` 终止运行,并再次运行 `cargo tset` 时,咱们将看到文档测试,the doc tests,捕获到示例与代码不再相互同步!
+现在,当我们修改函数或者示例,从而让示例中的 `assert_eq!` 终止运行,并再次运行 `cargo tset` 时,我们将发现文档测试检测到示例和代码之间未相互保持一致!
-> 注:此状况下的输出为:
-
-```console
- Doc-tests cargo_features_demo
-
-running 1 test
-test src/lib.rs - add_one (line 7) ... FAILED
-
-failures:
-
----- src/lib.rs - add_one (line 7) stdout ----
-Test executable failed (exit status: 101).
-
-stderr:
-thread 'main' panicked at 'assertion failed: `(left == right)`
- left: `6`,
- right: `7`', src/lib.rs:7:1
-stack backtrace:
- 0: 0x5620cf499480 - std::backtrace_rs::backtrace::libunwind::trace::h32eb3e08e874dd27
- at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/../../backtrace/src/back trace/libunwind.rs:93:5
- // ...
- 36: 0x0 -
+> **译注**:此时运行测试的输出为:
+>
+> ```console
+> Doc-tests my_crate
+>
+> running 1 test
+> test src/lib.rs - add_one (line 5) ... FAILED
+>
+> failures:
+>
+> ---- src/lib.rs - add_one (line 5) stdout ----
+> Test executable failed (exit status: 101).
+>
+> stderr:
+>
+> thread 'main' (462614) panicked at /tmp/rustdoctestw0cEJx/doctest_bundle_2024.rs:9:1:
+> assertion `left == right` failed
+> left: 6
+> right: 7
+> note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+>
+>
+>
+> failures:
+> src/lib.rs - add_one (line 5)
+>
+> test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+> ```
+>
+> 执行 `cargo test --doc`,将只运行文档注释中的示例代码。
-
-failures:
- src/lib.rs - add_one (line 7)
-
-test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
-
-error: doctest failed, to rerun pass `--doc`
-```
-
-> 注:执行 `cargo test --doc`,将只运行文档注释中的示例代码。
+### 包含的程序项目注释
-### 注释被包含所在项目
+`//!` 样式的文档注释,会添加文档到 *包含* 注释的项目,而非注释 *之后* 的项目。我们通常在代码箱根文件(依惯例为 `src/lib.rs`)内,或模组内添加这些文档注释,来将代码箱或模组作为整体,而为其编写文档。
-**Commenting Contained Items,代码箱、模组整体的注释**
-
-
-`//!` 样式的文档注释,会把文档添加到包含注释的条目,而非注释之后的条目。咱们通常在代码箱根文件里(依惯例即 `src/lib.rs`),或模组里,添加这些文档注释,来将代码箱或模组作为整体,而为其编写文档,the style of doc comment `//!` adds documentation to the item contains the comments rather than to the items following the comments. We typically use these doc comments inside the crate root file(`src/lib.rs` by convention) or inside a module to document the crate or the module as a whole。
-
-比如,要添加描述包含了 `add_one` 函数的 `cargo_features_demo` 代码箱目的的文档,咱们就要添加以 `//!` 开始的文档注释,到 `src/lib.rs` 文件的开头,如下清单 14-2 中所示:
+例如,为了添加描述包含 `add_one` 函数的 `my_crate` 代码箱用途的文档,我们就要添加以 `//!` 开头的文档注释,至 `src/lib.rs` 文件的开头,如下清单 14-2 中所示:
+
文件:`src/lib.rs`
```rust
-//! # Cargo 特性示例代码箱
-//!
-//! `cargo_features_demo` 是令到执行某些确切计算更便利
-//! 的一些工具的集合。
+//! # 我的代码箱
//!
+//! `my_crate` 是个实用工具集,旨在让执行
+//! 某些计算更加便捷。
-/// 将一加到所给数字。
+/// 加一到给定的数字。
// --跳过代码--
```
-*清单 14-2:作为一个整体的 `cargo_features_demo` 代码箱的文档*
+**清单 14-2**:`my_crate` 代码箱作为一个整体的文档
请注意由于咱们是以 `//!` 而非 `///` 开始的这些注释,因此在以 `//!` 开始的最后一行后,并无任何代码的,咱们是在给包含此注释的程序项目,而非紧接着此注释的程序项目编写文档。在此示例中,那个程序项目就是 `src/lib.rs` 文件,为代码箱根。这些注释描述了整个代码箱。
diff --git a/src/images/14-01.png b/src/images/14-01.png
index 0a3f56f..b1fa013 100644
Binary files a/src/images/14-01.png and b/src/images/14-01.png differ