diff --git a/docs/ch01-00-introduction.html b/docs/ch01-00-introduction.html index 07a5ee3..b4361da 100644 --- a/docs/ch01-00-introduction.html +++ b/docs/ch01-00-introduction.html @@ -47,7 +47,7 @@
@@ -113,20 +113,6 @@ registry site),crates.io!我们期待看 - - diff --git a/docs/ch01-01-installation.html b/docs/ch01-01-installation.html index 60d9a13..06ca6c6 100644 --- a/docs/ch01-01-installation.html +++ b/docs/ch01-01-installation.html @@ -47,7 +47,7 @@
@@ -148,20 +148,6 @@ commit f828919e62aa542aaaae03c1fb565da42374213e

- - diff --git a/docs/ch01-02-hello-world.html b/docs/ch01-02-hello-world.html index 5146379..c64b5df 100644 --- a/docs/ch01-02-hello-world.html +++ b/docs/ch01-02-hello-world.html @@ -47,7 +47,7 @@
@@ -272,20 +272,6 @@ $ carg - - diff --git a/docs/ch02-00-guessing-game-tutorial.html b/docs/ch02-00-guessing-game-tutorial.html index 1b34d5d..0efe91e 100644 --- a/docs/ch02-00-guessing-game-tutorial.html +++ b/docs/ch02-00-guessing-game-tutorial.html @@ -47,7 +47,7 @@
@@ -663,20 +663,6 @@ fn main() { - - diff --git a/docs/ch03-00-common-programming-concepts.html b/docs/ch03-00-common-programming-concepts.html index 5d94f47..e924aee 100644 --- a/docs/ch03-00-common-programming-concepts.html +++ b/docs/ch03-00-common-programming-concepts.html @@ -47,7 +47,7 @@
@@ -122,20 +122,6 @@ commit 2067b6e2bff990bceb39ae8f35780bd3bed08644

- - diff --git a/docs/ch03-01-variables-and-mutability.html b/docs/ch03-01-variables-and-mutability.html index 7dcad96..c129bfd 100644 --- a/docs/ch03-01-variables-and-mutability.html +++ b/docs/ch03-01-variables-and-mutability.html @@ -47,7 +47,7 @@
@@ -206,20 +206,6 @@ spaces = spaces.len(); - - diff --git a/docs/ch03-02-data-types.html b/docs/ch03-02-data-types.html index d9dcd3e..c907434 100644 --- a/docs/ch03-02-data-types.html +++ b/docs/ch03-02-data-types.html @@ -47,7 +47,7 @@
@@ -294,20 +294,6 @@ error: Process didn't exit successfully: `target/debug/arrays` (exit code: 101) - - diff --git a/docs/ch03-03-how-functions-work.html b/docs/ch03-03-how-functions-work.html index adc739a..a5bb322 100644 --- a/docs/ch03-03-how-functions-work.html +++ b/docs/ch03-03-how-functions-work.html @@ -47,7 +47,7 @@
@@ -291,20 +291,6 @@ help: consider removing this semicolon: - - diff --git a/docs/ch03-04-comments.html b/docs/ch03-04-comments.html index 6ed8727..6d42e98 100644 --- a/docs/ch03-04-comments.html +++ b/docs/ch03-04-comments.html @@ -47,7 +47,7 @@
@@ -138,20 +138,6 @@ commit 74d6fc999b986b74bf94edd6dcbb5a08a16c12de

- - diff --git a/docs/ch03-05-control-flow.html b/docs/ch03-05-control-flow.html index 6ac1459..90ba05e 100644 --- a/docs/ch03-05-control-flow.html +++ b/docs/ch03-05-control-flow.html @@ -47,7 +47,7 @@
@@ -366,20 +366,6 @@ the value is: 50 - - diff --git a/docs/ch04-00-understanding-ownership.html b/docs/ch04-00-understanding-ownership.html index 30f18e3..e6f9263 100644 --- a/docs/ch04-00-understanding-ownership.html +++ b/docs/ch04-00-understanding-ownership.html @@ -47,7 +47,7 @@
@@ -116,20 +116,6 @@ commit 759067b651a48a4a66485fe0876d318d398fb4fe

- - diff --git a/docs/ch04-01-what-is-ownership.html b/docs/ch04-01-what-is-ownership.html index 19e42ed..499fee9 100644 --- a/docs/ch04-01-what-is-ownership.html +++ b/docs/ch04-01-what-is-ownership.html @@ -47,7 +47,7 @@
@@ -381,20 +381,6 @@ fn calculate_length(s: String) -> (String, usize) { - - diff --git a/docs/ch04-02-references-and-borrowing.html b/docs/ch04-02-references-and-borrowing.html index d5b074f..0becbfd 100644 --- a/docs/ch04-02-references-and-borrowing.html +++ b/docs/ch04-02-references-and-borrowing.html @@ -47,7 +47,7 @@
@@ -314,20 +314,6 @@ for it to be borrowed from. - - diff --git a/docs/ch04-03-slices.html b/docs/ch04-03-slices.html index c869382..9df2aaf 100644 --- a/docs/ch04-03-slices.html +++ b/docs/ch04-03-slices.html @@ -47,7 +47,7 @@
@@ -321,20 +321,6 @@ let slice = &a[1..3]; - - diff --git a/docs/ch05-00-structs.html b/docs/ch05-00-structs.html index ce210a7..9ba2de5 100644 --- a/docs/ch05-00-structs.html +++ b/docs/ch05-00-structs.html @@ -47,7 +47,7 @@
@@ -335,20 +335,6 @@ fn main() { - - diff --git a/docs/ch05-01-method-syntax.html b/docs/ch05-01-method-syntax.html index 5d6881a..fbcc767 100644 --- a/docs/ch05-01-method-syntax.html +++ b/docs/ch05-01-method-syntax.html @@ -47,7 +47,7 @@
@@ -239,20 +239,6 @@ impl Rectangle { - - diff --git a/docs/ch06-00-enums.html b/docs/ch06-00-enums.html index 46acef1..19dd0ea 100644 --- a/docs/ch06-00-enums.html +++ b/docs/ch06-00-enums.html @@ -47,7 +47,7 @@
@@ -117,20 +117,6 @@ commit 396e2db4f7de2e5e7869b1f8bc905c45c631ad7d

- - diff --git a/docs/ch06-01-defining-an-enum.html b/docs/ch06-01-defining-an-enum.html index 742b3bc..845d466 100644 --- a/docs/ch06-01-defining-an-enum.html +++ b/docs/ch06-01-defining-an-enum.html @@ -47,7 +47,7 @@
@@ -312,20 +312,6 @@ not satisfied - - diff --git a/docs/ch06-02-match.html b/docs/ch06-02-match.html index 456cc6f..91b393b 100644 --- a/docs/ch06-02-match.html +++ b/docs/ch06-02-match.html @@ -47,7 +47,7 @@
@@ -277,20 +277,6 @@ match some_u8_value { - - diff --git a/docs/ch06-03-if-let.html b/docs/ch06-03-if-let.html index 433e8d7..5849177 100644 --- a/docs/ch06-03-if-let.html +++ b/docs/ch06-03-if-let.html @@ -47,7 +47,7 @@
@@ -86,6 +86,62 @@ match some_u8_value { Some(3)

+

我们想要对Some(3)匹配进行操作不过不想处理任何其他Some<u8>值或None值。为了满足match表达式(穷尽性)的要求,必须在处理完这唯一的成员后加上_ => (),这样也要增加很多样板代码。

+

不过我们可以使用if let这种更短的方式编写。如下代码与列表 6-6 中的match行为一致:

+
# let some_u8_value = Some(0u8);
+if let Some(3) = some_u8_value {
+    println!("three");
+}
+
+

if let获取通过=分隔的一个模式和一个表达式。它的工作方式与match相同,这里的表达式对应match而模式则对应第一个分支。

+

使用if let意味着编写更少代码,更少的缩进和更少的样板代码。然而,这样会失去match强制要求的穷进行检查。matchif let之间的选择依赖特定的环境以及增加简洁度和失去穷尽性检查的权衡取舍。

+

换句话说,可以认为if letmatch的一个语法糖,它当值匹配某一模式时执行代码而忽略所有其他值。

+

可以在if let中包含一个elseelse块中的代码与match表达式中的_分支块中的代码相同,这样的match表达式就等同于if letelse。回忆一下列表 6-4 中Coin枚举的定义,它的Quarter成员包含一个UsState值。如果想要计数所有不是 25 美分的硬币的同时也报告 25 美分硬币所属的州,可以使用这样一个match表达式:

+
# #[derive(Debug)]
+# enum UsState {
+#    Alabama,
+#    Alaska,
+# }
+#
+# enum Coin {
+#    Penny,
+#    Nickel,
+#    Dime,
+#    Quarter(UsState),
+# }
+# let coin = Coin::Penny;
+let mut count = 0;
+match coin {
+    Coin::Quarter(state) => println!("State quarter from {:?}!", state),
+    _ => count += 1,
+}
+
+

或者可以使用这样的if letelse表达式:

+
# #[derive(Debug)]
+# enum UsState {
+#    Alabama,
+#    Alaska,
+# }
+#
+# enum Coin {
+#    Penny,
+#    Nickel,
+#    Dime,
+#    Quarter(UsState),
+# }
+# let coin = Coin::Penny;
+let mut count = 0;
+if let Coin::Quarter(state) = coin {
+    println!("State quarter from {:?}!", state);
+} else {
+    count += 1;
+}
+
+

如果你的程序遇到一个使用match表达起来过于啰嗦的逻辑,记住if let也在你的 Rust 工具箱中。

+

总结

+

现在我们涉及到了如何使用枚举来创建有一系列可列举值的自定义类型。我们也展示了标准库的Option<T>类型是如何帮助你利用类型系统来避免出错。当枚举值包含数据时,你可以根据需要处理多少情况来选择使用matchif let来获取并使用这些值。

+

你的 Rust 程序现在能够使用结构体和枚举在自己的作用域内表现其内容了。在你的 API 中使用自定义类型保证了类型安全:编译器会确保你的函数只会得到它期望的类型的值。

+

为了向你的用户提供一个组织良好的 API,它使用直观且只向用户暴露他们确实需要的部分,那么让我们转向 Rust 的模块系统吧。

@@ -97,6 +153,10 @@ match some_u8_value { + +
@@ -107,6 +167,10 @@ match some_u8_value { + +
@@ -120,20 +184,6 @@ match some_u8_value { - - diff --git a/docs/ch07-00-modules.html b/docs/ch07-00-modules.html new file mode 100644 index 0000000..3a23abf --- /dev/null +++ b/docs/ch07-00-modules.html @@ -0,0 +1,116 @@ + + + + + Rust 程序设计语言 中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+ + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + diff --git a/docs/ch07-01-mod-and-the-filesystem.html b/docs/ch07-01-mod-and-the-filesystem.html new file mode 100644 index 0000000..8742049 --- /dev/null +++ b/docs/ch07-01-mod-and-the-filesystem.html @@ -0,0 +1,116 @@ + + + + + Rust 程序设计语言 中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+ + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + diff --git a/docs/ch07-02-controlling-visibility-with-pub.html b/docs/ch07-02-controlling-visibility-with-pub.html new file mode 100644 index 0000000..2ddd01e --- /dev/null +++ b/docs/ch07-02-controlling-visibility-with-pub.html @@ -0,0 +1,116 @@ + + + + + Rust 程序设计语言 中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+ + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + diff --git a/docs/ch07-03-importing-names-with-use.html b/docs/ch07-03-importing-names-with-use.html new file mode 100644 index 0000000..6135efd --- /dev/null +++ b/docs/ch07-03-importing-names-with-use.html @@ -0,0 +1,108 @@ + + + + + Rust 程序设计语言 中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + diff --git a/docs/index.html b/docs/index.html index 4fec122..55e6998 100644 --- a/docs/index.html +++ b/docs/index.html @@ -46,7 +46,7 @@
@@ -112,20 +112,6 @@ registry site),crates.io!我们期待看 - - diff --git a/docs/print.html b/docs/print.html index eceecbd..2808291 100644 --- a/docs/print.html +++ b/docs/print.html @@ -47,7 +47,7 @@
@@ -3048,6 +3048,62 @@ match some_u8_value { Some(3)

+

我们想要对Some(3)匹配进行操作不过不想处理任何其他Some<u8>值或None值。为了满足match表达式(穷尽性)的要求,必须在处理完这唯一的成员后加上_ => (),这样也要增加很多样板代码。

+

不过我们可以使用if let这种更短的方式编写。如下代码与列表 6-6 中的match行为一致:

+
# let some_u8_value = Some(0u8);
+if let Some(3) = some_u8_value {
+    println!("three");
+}
+
+

if let获取通过=分隔的一个模式和一个表达式。它的工作方式与match相同,这里的表达式对应match而模式则对应第一个分支。

+

使用if let意味着编写更少代码,更少的缩进和更少的样板代码。然而,这样会失去match强制要求的穷进行检查。matchif let之间的选择依赖特定的环境以及增加简洁度和失去穷尽性检查的权衡取舍。

+

换句话说,可以认为if letmatch的一个语法糖,它当值匹配某一模式时执行代码而忽略所有其他值。

+

可以在if let中包含一个elseelse块中的代码与match表达式中的_分支块中的代码相同,这样的match表达式就等同于if letelse。回忆一下列表 6-4 中Coin枚举的定义,它的Quarter成员包含一个UsState值。如果想要计数所有不是 25 美分的硬币的同时也报告 25 美分硬币所属的州,可以使用这样一个match表达式:

+
# #[derive(Debug)]
+# enum UsState {
+#    Alabama,
+#    Alaska,
+# }
+#
+# enum Coin {
+#    Penny,
+#    Nickel,
+#    Dime,
+#    Quarter(UsState),
+# }
+# let coin = Coin::Penny;
+let mut count = 0;
+match coin {
+    Coin::Quarter(state) => println!("State quarter from {:?}!", state),
+    _ => count += 1,
+}
+
+

或者可以使用这样的if letelse表达式:

+
# #[derive(Debug)]
+# enum UsState {
+#    Alabama,
+#    Alaska,
+# }
+#
+# enum Coin {
+#    Penny,
+#    Nickel,
+#    Dime,
+#    Quarter(UsState),
+# }
+# let coin = Coin::Penny;
+let mut count = 0;
+if let Coin::Quarter(state) = coin {
+    println!("State quarter from {:?}!", state);
+} else {
+    count += 1;
+}
+
+

如果你的程序遇到一个使用match表达起来过于啰嗦的逻辑,记住if let也在你的 Rust 工具箱中。

+

总结

+

现在我们涉及到了如何使用枚举来创建有一系列可列举值的自定义类型。我们也展示了标准库的Option<T>类型是如何帮助你利用类型系统来避免出错。当枚举值包含数据时,你可以根据需要处理多少情况来选择使用matchif let来获取并使用这些值。

+

你的 Rust 程序现在能够使用结构体和枚举在自己的作用域内表现其内容了。在你的 API 中使用自定义类型保证了类型安全:编译器会确保你的函数只会得到它期望的类型的值。

+

为了向你的用户提供一个组织良好的 API,它使用直观且只向用户暴露他们确实需要的部分,那么让我们转向 Rust 的模块系统吧。

@@ -3074,20 +3130,6 @@ match some_u8_value { - - diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 5b02b6a..27cb06b 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -26,4 +26,11 @@ - [枚举和模式匹配](ch06-00-enums.md) - [定义枚举](ch06-01-defining-an-enum.md) - [`match`控制流运算符](ch06-02-match.md) - - [`if let`简单控制流](ch06-03-if-let.md) \ No newline at end of file + - [`if let`简单控制流](ch06-03-if-let.md) + +## 基本 Rust 技能 + +- [模块](ch07-00-modules.md) + - [`mod`和文件系统](ch07-01-mod-and-the-filesystem.md) + - [使用`pub`空值可见性](ch07-02-controlling-visibility-with-pub.md) + - [使用`use`导入命名空间](ch07-03-importing-names-with-use.md) \ No newline at end of file diff --git a/src/ch06-03-if-let.md b/src/ch06-03-if-let.md index 5bbf59d..c7b3cb7 100644 --- a/src/ch06-03-if-let.md +++ b/src/ch06-03-if-let.md @@ -24,3 +24,76 @@ Listing 6-6: A `match` that only cares about executing code when the value is +我们想要对`Some(3)`匹配进行操作不过不想处理任何其他`Some`值或`None`值。为了满足`match`表达式(穷尽性)的要求,必须在处理完这唯一的成员后加上`_ => ()`,这样也要增加很多样板代码。 + +不过我们可以使用`if let`这种更短的方式编写。如下代码与列表 6-6 中的`match`行为一致: + +```rust +# let some_u8_value = Some(0u8); +if let Some(3) = some_u8_value { + println!("three"); +} +``` + +`if let`获取通过`=`分隔的一个模式和一个表达式。它的工作方式与`match`相同,这里的表达式对应`match`而模式则对应第一个分支。 + +使用`if let`意味着编写更少代码,更少的缩进和更少的样板代码。然而,这样会失去`match`强制要求的穷进行检查。`match`和`if let`之间的选择依赖特定的环境以及增加简洁度和失去穷尽性检查的权衡取舍。 + +换句话说,可以认为`if let`是`match`的一个语法糖,它当值匹配某一模式时执行代码而忽略所有其他值。 + +可以在`if let`中包含一个`else`。`else`块中的代码与`match`表达式中的`_`分支块中的代码相同,这样的`match`表达式就等同于`if let`和`else`。回忆一下列表 6-4 中`Coin`枚举的定义,它的`Quarter`成员包含一个`UsState`值。如果想要计数所有不是 25 美分的硬币的同时也报告 25 美分硬币所属的州,可以使用这样一个`match`表达式: + +```rust +# #[derive(Debug)] +# enum UsState { +# Alabama, +# Alaska, +# } +# +# enum Coin { +# Penny, +# Nickel, +# Dime, +# Quarter(UsState), +# } +# let coin = Coin::Penny; +let mut count = 0; +match coin { + Coin::Quarter(state) => println!("State quarter from {:?}!", state), + _ => count += 1, +} +``` + +或者可以使用这样的`if let`和`else`表达式: + +```rust +# #[derive(Debug)] +# enum UsState { +# Alabama, +# Alaska, +# } +# +# enum Coin { +# Penny, +# Nickel, +# Dime, +# Quarter(UsState), +# } +# let coin = Coin::Penny; +let mut count = 0; +if let Coin::Quarter(state) = coin { + println!("State quarter from {:?}!", state); +} else { + count += 1; +} +``` + +如果你的程序遇到一个使用`match`表达起来过于啰嗦的逻辑,记住`if let`也在你的 Rust 工具箱中。 + +## 总结 + +现在我们涉及到了如何使用枚举来创建有一系列可列举值的自定义类型。我们也展示了标准库的`Option`类型是如何帮助你利用类型系统来避免出错。当枚举值包含数据时,你可以根据需要处理多少情况来选择使用`match`或`if let`来获取并使用这些值。 + +你的 Rust 程序现在能够使用结构体和枚举在自己的作用域内表现其内容了。在你的 API 中使用自定义类型保证了类型安全:编译器会确保你的函数只会得到它期望的类型的值。 + +为了向你的用户提供一个组织良好的 API,它使用直观且只向用户暴露他们确实需要的部分,那么让我们转向 Rust 的模块系统吧。 \ No newline at end of file diff --git a/src/ch07-00-modules.md b/src/ch07-00-modules.md new file mode 100644 index 0000000..e69de29 diff --git a/src/ch07-01-mod-and-the-filesystem.md b/src/ch07-01-mod-and-the-filesystem.md new file mode 100644 index 0000000..e69de29 diff --git a/src/ch07-02-controlling-visibility-with-pub.md b/src/ch07-02-controlling-visibility-with-pub.md new file mode 100644 index 0000000..e69de29 diff --git a/src/ch07-03-importing-names-with-use.md b/src/ch07-03-importing-names-with-use.md new file mode 100644 index 0000000..e69de29