Skip to content

Commit 58c5deb

Browse files
committed
mod_trait_exerci = "0.1.3"
1 parent 7967869 commit 58c5deb

File tree

701 files changed

+2110
-528
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

701 files changed

+2110
-528
lines changed

docs/zh-first-volumn/src/SUMMARY.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@
3636
- [关于软件篋mod_trait_exerci](./hello-mod-trait/about.md)
3737
- [文件与模块](./hello-mod-trait/crate-structure.md)
3838
- [共享篋:程序结构和代码解释](./hello-mod-trait/lib-codes.md)
39-
- [共享篋:三种调用方式解释](./hello-mod-trait/exampels-codes.md)
39+
- [三种调用方式解释](./hello-mod-trait/exampels-codes.md)
4040
- [理解动态与静态调度实现](./hello-mod-trait/examples-dispatch.md)
4141
- [深度解析动态与静态调度实现](./hello-mod-trait/examples-miri.md)
42-
- [共享篋:静态调度实现](./hello-mod-trait/lib-static.md)
43-
- [共享篋:动态调度实现](./hello-mod-trait/lib-dynamic.md)
42+
- [共享篋:简单三层结构实现](./hello-mod-trait/lib-fn.md)
43+
- [共享篋:基于封装的静态调度实现](./hello-mod-trait/lib-static.md)
44+
- [共享篋:基于封装的动态调度实现](./hello-mod-trait/lib-dynamic.md)
4445
- [共享篋:目录测试代码解释](./hello-mod-trait/lib-tests.md)
4546
- [题外话:泛型实例](./hello-mod-trait/off-topic.md)
4647
- [软件篋deref_exerci](./hello-deref/README.md)

docs/zh-first-volumn/src/foreword/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434

3535
  本书面向的读者是,致在了解Rust语言概念和设计思想,同时也学习具体程序开发的方法。
3636

37+
## 关于本书使用系统说明
38+
39+
  本书程序代码使用苹果电脑系统开发的。大部分终端命令也应用适用于其它操作系统。
40+
3741
## Rust语言重要网站
3842
- [Rust官方网站](https://www.rust-lang.org/)
3943
- [rustup官方网站](https://rustup.rs/)

docs/zh-first-volumn/src/hello-mod-trait/about.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
## 篇目
77

8-
1. [项目名称清单](#项目名称清单)
9-
1. [软件篋类型清单](#软件篋类型清单)
10-
1. [项目目录文件结构](#项目目录文件结构)
8+
- [项目名称清单](#项目名称清单)
9+
- [软件篋类型清单](#软件篋类型清单)
10+
- [项目目录文件结构](#项目目录文件结构)
1111

1212
## 项目名称清单
1313

docs/zh-first-volumn/src/hello-mod-trait/crate-structure.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
- 理解和掌握Cargo项目文件与文件关系
1010

1111
## 篇目
12-
1. [文件本身表达模块方式](#文件本身表达模块方式)
13-
1. [文件名称表达模块方式](#文件名称表达模块方式)
14-
1. [目录名称表达模块方式](#目录名称表达模块方式)
15-
1. [参考资料](#参考资料)
12+
- [文件本身表达模块方式](#文件本身表达模块方式)
13+
- [文件名称表达模块方式](#文件名称表达模块方式)
14+
- [目录名称表达模块方式](#目录名称表达模块方式)
15+
- [参考资料](#参考资料)
1616

1717
![image](../../images/hello_mod_trait_00_structure.png)
1818

docs/zh-first-volumn/src/hello-mod-trait/exampels-codes.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 共享篋:三种调用方式解释
1+
# 三种调用方式解释
22

33
  在本节里,通过两个模块`mod_bare``mod_trait`实现及其三种调用方式比较,详细说明衔接关键词`trait`作用。
44

@@ -7,16 +7,16 @@
77
- 掌握衔接关键词`trait`实现的应用方法
88

99
## 篇目
10-
1. [基于结构类型的实现:使用实例调用](#基于结构类型的实现:使用实例调用)
11-
1. [基于衔接特质的实现:使用实例调用](#基于衔接特质的实现:使用实例调用)
12-
1. [基于衔接特质的模块](#基于衔接特质的模块)
13-
1. [基于衔接特质的实现:作为参数调用](#基于衔接特质的实现:作为参数调用)
14-
1. [题外话](#题外话)
15-
1. [浅说面向对象编程、命令式编程和声明式编程](#浅说面向对象编程、命令式编程和声明式编程)
16-
1. [数据类型数组](#数据类型数组)
17-
2. [泛型函数与方法](#泛型函数与方法)
18-
3. [类型范围关键词`where`](#类型范围关键词where)
19-
4. [参考资料](#参考资料)
10+
- [基于结构类型的实现:使用实例调用](#基于结构类型的实现:使用实例调用)
11+
- [基于衔接特质的实现:使用实例调用](#基于衔接特质的实现:使用实例调用)
12+
- [基于衔接特质的模块](#基于衔接特质的模块)
13+
- [基于衔接特质的实现:作为参数调用](#基于衔接特质的实现:作为参数调用)
14+
- [题外话](#题外话)
15+
- [浅说面向对象编程、命令式编程和声明式编程](#浅说面向对象编程、命令式编程和声明式编程)
16+
- [数据类型数组](#数据类型数组)
17+
- [泛型函数与方法](#泛型函数与方法)
18+
- [类型范围关键词`where`](#类型范围关键词where)
19+
- [参考资料](#参考资料)
2020

2121
![image](../../images/hello_mod_trait_04_apply_ways.png)
2222

@@ -46,7 +46,7 @@
4646

4747
## 基于衔接特质的实现:作为参数调用
4848

49-
  从上面图示,可以了解到下面程序文件并不是直接访问模块`mod_trait`本身,而是访问中间模块`mod_where_fn`完成的,这是一种更加方便和灵活的三层程序设计结构。
49+
  从上面图示,可以了解到下面程序文件并不是直接访问模块`mod_trait`本身,而是访问中间模块`mod_where_fn`完成的,这是一种更加方便和灵活的三层程序设计结构。与模块`mod_trait`不同,它实现的功能更多的是数据操作功能,这里称之为“`数据模块`”,而这种中间模块`mod_where_fn`,它提供更多样化的有实际意义知识性功能,这里称之为“`知识模块`”。
5050

5151
  无论是什么类型结构,为了获取不同的结构类型属性,都不需要访问其属性名称。
5252

docs/zh-first-volumn/src/hello-mod-trait/examples-miri.md

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,59 @@
11
# 深度解析动态与静态调度实现
22

3-
## 说明是Miri
3+
  在本节里。主要解释静态函数与动态函数的内部结构。
44

5-
An experimental interpreter for Rust's mid-level intermediate representation (MIR).
5+
## 学习内容
6+
- 进一步学习静态函数与动态函数
7+
- 通过Miri了解分析Rust语言代码
68

7-
##
9+
## 篇目
10+
11+
- [什么是Miri](#什么是Miri)
12+
- [与Miri相关的Cargo工具命令](#与Miri相关的Cargo工具命令)
13+
- [打开Miri代码文件命令](#打开Miri代码文件命令)
14+
- [Miri代码实例说明](#Miri代码实例说明)
15+
- [参考资料](#参考资料)
16+
17+
## 什么是Miri
18+
19+
  [Miri](https://github.com/rust-lang/miri)网站说明如下:
20+
21+
An experimental interpreter for Rust's mid-level intermediate representation (MIR).
22+
23+
直接翻译为:Rust语言的中间中级水平表达层(mid-level intermediate representation,MIR)的实验解释器。这里有两个中间是什么意思?“intermediate”是说明Miri是介于Rust语言与汇编语言编译过程的中间位置;“mid-level”可以理解为表达层代码水平。
24+
25+
  Miri作用是什么?在编译器中引入这一表达层(MIR),消除了Rust语言代码大部分表面的表示层(mid-level),留下了一种更简单的形式,目的是适合于类型检查和翻译成汇编语言(intermediate)。
26+
27+
## 与Miri相关的Cargo工具命令
28+
29+
  在项目根目录下,执行代码命令,可以得到Miri代码文件。一般情况下,该文件是不会出现在项目目录里的。
30+
31+
  这个命令是两部分,在`cargo之前部分,是告诉编译器想到得到额外的编译结果。后面部分是想编译什么内容。
32+
33+
  与Miri编译相关内容是在`release`编译版本下才能得到。
834

935
```bash
1036
RUSTFLAGS="--emit mir" cargo build --release --example trait_dispatch_concrete
1137
```
1238

39+
## 打开Miri代码文件命令
40+
41+
  可以通过资源管理器来寻找如下命令里的目录文件,也可以使用下面命令打开,其中`-t`是告诉命令`open`使用默认编辑器打开该文件。该文件名称非常长,所以命令里使用了星号。
42+
43+
  从网络上看,还没有能够显示Miri代码的工具。
44+
45+
```bash
46+
open -t ./target/release/examples/trait_dispatch_concrete-*.mir
47+
```
48+
49+
## Miri代码实例说明
50+
51+
  为了说明问题,下面Miri代码仅仅是其一部分代码,包括静态函数和动态函数,并且还是省略过的。凡是"..."都是两个函数相同的代码。
52+
53+
  从下面的Miri代码里,可以看到,函数`static_dispatch()`的参数只有一个,它是衔接特质的对象指针,函数`dynamic_dispatch`的参数也只有一个,它是衔接特质的指针。除了这一点区别之外,其余都是一样的。
54+
55+
  从上面分析可以了解到,衔接特质的对象是确定的,使用它,可以理解为已知类型的特质准备的,而动态的衔接特质是不确定的,可以理解为未知类型的特质准备的。
56+
1357
```
1458
fn static_dispatch(_1: &TraitObject) -> () {
1559
...
@@ -27,10 +71,6 @@ fn static_dispatch(_1: &TraitObject) -> () {
2771
}
2872
```
2973

30-
```bash
31-
open -t ./target/release/examples/trait_dispatch_concrete-*.mir
32-
```
33-
3474
```
3575
fn dynamic_dispatch(_1: &dyn Trait) -> () {
3676
...
@@ -47,6 +87,5 @@ fn dynamic_dispatch(_1: &dyn Trait) -> () {
4787
}
4888
```
4989

50-
51-
90+
## 参考资料
5291
- [An interpreter for Rust's mid-level intermediate representation](https://github.com/rust-lang/miri)

docs/zh-first-volumn/src/hello-mod-trait/lib-codes.md

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,60 @@
66
- 了解和学习不同结构类型关键词`struct`实现方法
77

88
## 篇目
9-
1. [基于结构类型的实现](#基于结构类型的实现)
10-
1. [基于衔接特质的实现](#基于衔接特质的实现)
11-
1. [参考资料](#参考资料)
9+
- [基于结构类型的实现](#基于结构类型的实现)
10+
- [基于衔接特质的实现](#基于衔接特质的实现)
11+
- [题外话](#题外话)
12+
- [学习理解编译错误](#学习理解编译错误)
13+
- [参考资料](#参考资料)
1214

1315
## 基于结构类型的实现
1416

1517
### 模块`mod_bare`结构
1618
![image](../../images/hello_mod_trait_02_mod_bar.png)
1719

1820
### 模块`mod_bare`代码
21+
22+
https://doc.rust-lang.org/stable/error-index.html#E0038
23+
1924
{{#playpen ../../../../hello-mod-trait/lib-hello/src/mod_bare/mod.rs editable}}
2025

2126
## 基于衔接特质的实现
2227

2328
### 模块`mod_trait`结构
29+
2430
![image](../../images/hello_mod_trait_01_mod_trait.png)
2531

2632
### 模块`mod_trait`代码
33+
34+
  两个类型的函数new()是通过属性值,实现创建其类型的实例,而特质方法get_object()是通过其类型本身实例,实现创建一个新的类型实例。
35+
2736
{{#playpen ../../../../hello-mod-trait/lib-hello/src/lib.rs editable}}
2837

29-
## 参考资料
38+
## 题外话
39+
40+
### 学习理解编译错误
41+
42+
  在程序文件`src/lib.rs`里,使用关键词`trait`定义衔接特质`TraitCanal`代码块的第一行代码注释掉,而第二行代码去掉注释,一旦执行编译,就会出现下面错误信息:`error[E0038]`
3043

44+
error[E0038]: the trait `mod_trait::TraitCanal` cannot be made into
45+
an object
46+
--> lib-hello/src/mod_dynamic_fn.rs:4:1
47+
|
48+
4 | pub fn get_dynamic_trait_ref(canal: &dyn TraitCanal) -> (u32) {
49+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ t
50+
he trait `mod_trait::TraitCanal` cannot be made into an object
51+
|
52+
= note: method `init` references the `Self` type in its arguments
53+
or return type
3154

55+
  下面链接里的`E0038`就是该错误编号,点击下面链接就可以了解到错误的原因信息。
3256

57+
[https://doc.rust-lang.org/stable/error-index.html#E0038](https://doc.rust-lang.org/stable/error-index.html#E0038)
58+
59+
## 参考资料
60+
- [Rust Compiler Error Index](https://doc.rust-lang.org/stable/error-index.html)
61+
- [std Sized](https://doc.rust-lang.org/std/marker/trait.Sized.html)
62+
- [why-is-the-sized-bound-necessary-in-this-trait](https://stackoverflow.com/questions/30938499/why-is-the-sized-bound-necessary-in-this-trait)
3363

3464

3565

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
# 共享篋:动态调度实现
1+
# 共享篋:基于封装的动态调度实现
22

33

44

5-
{{#playpen ../../../../hello-mod-trait/lib-hello/src/mod_dynamic_fn.rs editable}}
5+
{{#playpen ../../../../hello-mod-trait/lib-hello/src/mod_box_dynamic_fn.rs editable}}
66

77
{{#playpen ../../../../hello-mod-trait/lib-hello/examples/box_dynamic_hello.rs editable}}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# 共享篋:简单三层结构实现
2+
3+
  在前面学习概念基础之上,在这一节里,将会实现共享篋的简单三层结构。
4+
5+
## 学习内容
6+
- 理解和掌握知识模块的实现
7+
8+
## 篇目
9+
- [静态函数的知识模块实现](#静态函数的知识模块实现)
10+
- [动态函数的知识模块实现](#动态函数的知识模块实现)
11+
- [应用实例](#应用实例)
12+
- [参考资料](#参考资料)
13+
14+
## 静态函数的知识模块实现
15+
16+
  下面模块`mod_static_fn`代码,利用衔接特质`TraitCanal`,实现了两个不同功能的静态函数:`get_static_type_ref()``print_static_all_daten()`
17+
18+
  关于函数`get_static_type_ref()`,输入实例是类型`StructType`或者`TupleType`的指针,输出是类型`tuple`,其元素值是它们属性`data`值。
19+
20+
  关于函数`print_static_all_daten()`,输入实例是`StructType`或者`TupleType`数组的指针,程序接受输入实例以后,打印输入实例及其属性内容。
21+
22+
  为了使用函数`print_static_all_daten()`里的打印宏,程序里需要做到两点:
23+
24+
- 使用语句:`use std::fmt::Debug;`;
25+
- 函数参数里增加该特质`Debug`;
26+
27+
但是第一条语句应该不需要,因为类型`StructType``TupleType`已经声明过了特质`Debug`。如特质`PartialEq`就没有使用`use`语句,这是因为类型`StructType``TupleType`也已经声明过了`PartialEq`。但是有一点是肯定的:先要声明特质,然后还要在静态函数里使用它们,才能真正实现使用这些特质。
28+
29+
{{#playpen ../../../../hello-mod-trait/lib-hello/src/mod_static_fn.rs editable}}
30+
31+
## 动态函数的知识模块实现
32+
33+
  下面模块`mod_dynamic_fn`代码的函数,与前面的说明完全类似。
34+
35+
{{#playpen ../../../../hello-mod-trait/lib-hello/src/mod_dynamic_fn.rs editable}}
36+
37+
## 应用实例
38+
39+
  
40+
41+
{{#playpen ../../../../hello-mod-trait/lib-hello/examples/trait_fn_hello.rs editable}}
42+
43+
44+
45+
46+
## 参考资料
Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,23 @@
1-
# 共享篋:静态调度实现
1+
# 共享篋:基于封装的静态调度实现
22

3+
  在这一节里,学习Cargo项目文件、目录与模块相互关系。Rust语言表达模块的三种方式。
34

4-
{{#playpen ../../../../hello-mod-trait/lib-hello/src/mod_static_fn.rs editable}}
5+
## 学习内容
6+
- 了解和学习本软件篋模块文件结构
7+
- 理解和掌握Cargo项目目录与文件关系
8+
- 理解和掌握Cargo项目模块与文件关系
9+
- 理解和掌握Cargo项目文件与文件关系
10+
11+
## 篇目
12+
- [文件本身表达模块方式](#文件本身表达模块方式)
13+
- [文件名称表达模块方式](#文件名称表达模块方式)
14+
- [目录名称表达模块方式](#目录名称表达模块方式)
15+
- [参考资料](#参考资料)
16+
17+
18+
19+
20+
{{#playpen ../../../../hello-mod-trait/lib-hello/src/mod_box_static_fn.rs editable}}
521

622

723
{{#playpen ../../../../hello-mod-trait/lib-hello/examples/box_static_hello.rs editable}}

0 commit comments

Comments
 (0)