From 68344de35771ae4effced06d4b881e9f6075e959 Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Tue, 17 May 2022 17:25:59 +0800 Subject: [PATCH 1/6] fix: typo in ok-stack --- src/too-many-lists/ok-stack/iter.md | 10 ++++++---- src/too-many-lists/ok-stack/itermut.md | 1 + src/too-many-lists/ok-stack/peek.md | 4 ++-- src/too-many-lists/ok-stack/type-optimizing.md | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/too-many-lists/ok-stack/iter.md b/src/too-many-lists/ok-stack/iter.md index d8a8101e..17aa6d4a 100644 --- a/src/too-many-lists/ok-stack/iter.md +++ b/src/too-many-lists/ok-stack/iter.md @@ -217,7 +217,7 @@ impl<'a, T> Iterator for Iter<'a, T> { 现在,我们也许可以自信的编译下试试了: ```shell -cargo build +> cargo build error[E0308]: mismatched types --> src/second.rs:77:22 @@ -260,7 +260,8 @@ impl<'a, T> Iterator for Iter<'a, T> { ``` ```shell -cargo build +> cargo build + Compiling lists v0.1.0 (/Users/ABeingessner/dev/temp/lists) error[E0515]: cannot return reference to local data `*node` --> src/second.rs:77:43 @@ -314,7 +315,8 @@ impl<'a, T> Iterator for Iter<'a, T> { ``` ```shell -cargo build +> cargo build + Compiling lists v0.1.0 (/Users/ABeingessner/dev/temp/lists) error[E0308]: mismatched types --> src/second.rs:77:22 @@ -362,7 +364,7 @@ impl<'a, T> Iterator for Iter<'a, T> { ``` ```shell -cargo build +> cargo build ``` 🎉 🎉 🎉 diff --git a/src/too-many-lists/ok-stack/itermut.md b/src/too-many-lists/ok-stack/itermut.md index b1dc4706..4af8d1c5 100644 --- a/src/too-many-lists/ok-stack/itermut.md +++ b/src/too-many-lists/ok-stack/itermut.md @@ -58,6 +58,7 @@ impl<'a, T> Iterator for IterMut<'a, T> { ```shell > cargo build + error[E0596]: cannot borrow `self.head` as mutable, as it is behind a `&` reference --> src/second.rs:95:25 | diff --git a/src/too-many-lists/ok-stack/peek.md b/src/too-many-lists/ok-stack/peek.md index a268b40f..a3adecdc 100644 --- a/src/too-many-lists/ok-stack/peek.md +++ b/src/too-many-lists/ok-stack/peek.md @@ -46,7 +46,7 @@ pub fn peek(&self) -> Option<&T> { ``` ```shell -cargo build +> cargo build Finished dev [unoptimized + debuginfo] target(s) in 0.32s ``` @@ -124,7 +124,7 @@ fn peek() { 这次我们直接匹配出来可变引用 `value`,然后对其修改即可。 ```shell -cargo test +> cargo test Running target/debug/lists-5c71138492ad4b4a diff --git a/src/too-many-lists/ok-stack/type-optimizing.md b/src/too-many-lists/ok-stack/type-optimizing.md index 05667807..aecbeca0 100644 --- a/src/too-many-lists/ok-stack/type-optimizing.md +++ b/src/too-many-lists/ok-stack/type-optimizing.md @@ -137,7 +137,7 @@ test second::test::basics ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured ``` -很棒,接下来让我们来解决目前链表最大的问题:只支持 i32 类型的元素值。 +很棒,接下来让我们来解决目前链表最大的问题:只支持 `i32` 类型的元素值。 ## 泛型 为了让链表支持任何类型的元素,泛型就是绕不过去的坎,首先将所有的类型定义修改为泛型实现: From 10663a5649bd35b2d940f3638b54bebcc7670254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Wed, 18 May 2022 15:32:29 +0800 Subject: [PATCH 2/6] =?UTF-8?q?chore:=20=E8=A1=A5=E5=85=85new=E8=AF=B4?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/basic/method.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/method.md b/src/basic/method.md index d890a0e3..d35d24b4 100644 --- a/src/basic/method.md +++ b/src/basic/method.md @@ -20,7 +20,7 @@ struct Circle { } impl Circle { - // new是Circle的关联函数,因为它的第一个参数不是self + // new是Circle的关联函数,因为它的第一个参数不是self,且new并不是关键字 // 这种方法往往用于初始化当前结构体的实例 fn new(x: f64, y: f64, radius: f64) -> Circle { Circle { From 9b9cbd08711ab33125ea74221b000ed1ac387f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Wed, 18 May 2022 15:47:08 +0800 Subject: [PATCH 3/6] chore: formatting code --- src/basic/method.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/basic/method.md b/src/basic/method.md index d890a0e3..f37cdad9 100644 --- a/src/basic/method.md +++ b/src/basic/method.md @@ -256,7 +256,6 @@ impl Rectangle { ```rust #![allow(unused)] -fn main() { enum Message { Quit, Move { x: i32, y: i32 }, @@ -270,8 +269,9 @@ impl Message { } } -let m = Message::Write(String::from("hello")); -m.call(); +fn main() { + let m = Message::Write(String::from("hello")); + m.call(); } ``` From f3a68ff58da914aa22a10a7b87f19d0f8966bd32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Thu, 19 May 2022 08:49:55 +0800 Subject: [PATCH 4/6] =?UTF-8?q?docs:=20=E6=96=87=E6=A1=88=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit “缓存” 这个概念太宽泛了,可能用 “内存” 这个词更具象; 其他场景统称叫 IO 吧 😅 --- src/basic/trait/trait.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/trait/trait.md b/src/basic/trait/trait.md index 4763d1f6..9e8ca43a 100644 --- a/src/basic/trait/trait.md +++ b/src/basic/trait/trait.md @@ -1,6 +1,6 @@ # 特征 Trait -如果我们想定义一个文件系统,那么把该系统跟底层存储解耦是很重要的。文件操作主要包含三个:`open` 、`write`、`read`,这些操作可以发生在硬盘,也可以发生在缓存,可以通过网络也可以通过(我实在编不下去了,大家来帮帮我)。总之如果你要为每一种情况都单独实现一套代码,那这种实现将过于繁杂,而且也没那个必要。 +如果我们想定义一个文件系统,那么把该系统跟底层存储解耦是很重要的。文件操作主要包含三个:`open` 、`write`、`read`,这些操作可以发生在硬盘,也可以发生在内存,可以发生在网络请求,也可以发生在其他一些IO场景(我实在编不下去了,大家来帮帮我)。总之如果你要为每一种情况都单独实现一套代码,那这种实现将过于繁杂,而且也没那个必要。 要解决上述问题,需要把这些行为抽象出来,就要使用 Rust 中的特征 `trait` 概念。可能你是第一次听说这个名词,但是不要怕,如果学过其他语言,那么大概率你听说过接口,没错,特征很类似接口。 From 3f632796bb9c08b1e37479daa7f10537dc81b371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E9=9E=8B=E6=B2=A1=E5=8F=B7?= <308487730@qq.com> Date: Thu, 19 May 2022 08:51:55 +0800 Subject: [PATCH 5/6] =?UTF-8?q?docs:=20=E6=8E=AA=E8=BE=9E=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `impl Trait` 被贴上的标签是 “语法糖” --- src/basic/trait/trait.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/trait/trait.md b/src/basic/trait/trait.md index 4763d1f6..9ca6d2ae 100644 --- a/src/basic/trait/trait.md +++ b/src/basic/trait/trait.md @@ -191,7 +191,7 @@ pub fn notify(item: &T) { 真正的完整书写形式如上所述,形如 `T: Summary` 被称为**特征约束**。 -在简单的场景下 `impl Trait` 的语法就足够使用,但是对于复杂的场景,特征约束可以让我们拥有更大的灵活性和语法表现能力,例如一个函数接受两个 `impl Summary` 的参数: +在简单的场景下 `impl Trait` 这种语法糖就足够使用,但是对于复杂的场景,特征约束可以让我们拥有更大的灵活性和语法表现能力,例如一个函数接受两个 `impl Summary` 的参数: ```rust pub fn notify(item1: &impl Summary, item2: &impl Summary) {} From a1d39becbf9d56ca3f5849ba822e2ab9aa11b22e Mon Sep 17 00:00:00 2001 From: Sunface Date: Thu, 19 May 2022 15:10:03 +0800 Subject: [PATCH 6/6] Update src/basic/trait/trait.md --- src/basic/trait/trait.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/trait/trait.md b/src/basic/trait/trait.md index 9e8ca43a..5a190f23 100644 --- a/src/basic/trait/trait.md +++ b/src/basic/trait/trait.md @@ -1,6 +1,6 @@ # 特征 Trait -如果我们想定义一个文件系统,那么把该系统跟底层存储解耦是很重要的。文件操作主要包含三个:`open` 、`write`、`read`,这些操作可以发生在硬盘,也可以发生在内存,可以发生在网络请求,也可以发生在其他一些IO场景(我实在编不下去了,大家来帮帮我)。总之如果你要为每一种情况都单独实现一套代码,那这种实现将过于繁杂,而且也没那个必要。 +如果我们想定义一个文件系统,那么把该系统跟底层存储解耦是很重要的。文件操作主要包含三个:`open` 、`write`、`read`,这些操作可以发生在硬盘,可以发生在内存,还可以发生在网络IO甚至(...我实在编不下去了,大家来帮帮我)。总之如果你要为每一种情况都单独实现一套代码,那这种实现将过于繁杂,而且也没那个必要。 要解决上述问题,需要把这些行为抽象出来,就要使用 Rust 中的特征 `trait` 概念。可能你是第一次听说这个名词,但是不要怕,如果学过其他语言,那么大概率你听说过接口,没错,特征很类似接口。