Merge pull request #18 from sunface/main

sync
pull/1126/head
Rustln 3 years ago committed by GitHub
commit aae6dbf7e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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 {
@ -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();
}
```

@ -1,6 +1,6 @@
# 特征 Trait
如果我们想定义一个文件系统,那么把该系统跟底层存储解耦是很重要的。文件操作主要包含三个:`open` 、`write`、`read`,这些操作可以发生在硬盘,也可以发生在缓存,可以通过网络也可以通过(我实在编不下去了,大家来帮帮我)。总之如果你要为每一种情况都单独实现一套代码,那这种实现将过于繁杂,而且也没那个必要。
如果我们想定义一个文件系统,那么把该系统跟底层存储解耦是很重要的。文件操作主要包含三个:`open` 、`write`、`read`,这些操作可以发生在硬盘,可以发生在内存还可以发生在网络IO甚至(...我实在编不下去了,大家来帮帮我)。总之如果你要为每一种情况都单独实现一套代码,那这种实现将过于繁杂,而且也没那个必要。
要解决上述问题,需要把这些行为抽象出来,就要使用 Rust 中的特征 `trait` 概念。可能你是第一次听说这个名词,但是不要怕,如果学过其他语言,那么大概率你听说过接口,没错,特征很类似接口。
@ -191,7 +191,7 @@ pub fn notify<T: Summary>(item: &T) {
真正的完整书写形式如上所述,形如 `T: Summary` 被称为**特征约束**。
在简单的场景下 `impl Trait` 的语法就足够使用,但是对于复杂的场景,特征约束可以让我们拥有更大的灵活性和语法表现能力,例如一个函数接受两个 `impl Summary` 的参数:
在简单的场景下 `impl Trait` 这种语法糖就足够使用,但是对于复杂的场景,特征约束可以让我们拥有更大的灵活性和语法表现能力,例如一个函数接受两个 `impl Summary` 的参数:
```rust
pub fn notify(item1: &impl Summary, item2: &impl Summary) {}

@ -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
```
🎉 🎉 🎉

@ -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
|

@ -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

@ -137,7 +137,7 @@ test second::test::basics ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured
```
很棒,接下来让我们来解决目前链表最大的问题:只支持 i32 类型的元素值。
很棒,接下来让我们来解决目前链表最大的问题:只支持 `i32` 类型的元素值。
## 泛型
为了让链表支持任何类型的元素,泛型就是绕不过去的坎,首先将所有的类型定义修改为泛型实现:

Loading…
Cancel
Save