()
78 | let p2: *mut i32 = second_address __; // p2 指向 values 数组中的第二个元素
79 | unsafe {
80 | // 将第二个元素加 1
81 | __
82 | }
83 |
84 | assert_eq!(values[1], 3);
85 |
86 | println!("Success!")
87 | }
88 | ```
89 |
90 |
91 | 5. 🌟🌟🌟
92 | ```rust,editable
93 | fn main() {
94 | let arr :[u64; 13] = [0; 13];
95 | assert_eq!(std::mem::size_of_val(&arr), 8 * 13);
96 | let a: *const [u64] = &arr;
97 | let b = a as *const [u8];
98 | unsafe {
99 | assert_eq!(std::mem::size_of_val(&*b), __)
100 | }
101 | }
102 | ```
103 |
104 | > 你可以在[这里](https://github.com/sunface/rust-by-practice/blob/master/solutions/type-conversions/as.md)找到答案(在 solutions 路径下)
105 |
--------------------------------------------------------------------------------
/zh-CN/src/type-conversions/intro.md:
--------------------------------------------------------------------------------
1 | # Type conversions
2 | There are several ways we can use to perform type conversions, such as `as`, `From/Intro`, `TryFrom/TryInto`, `transmute` etc.
3 |
--------------------------------------------------------------------------------
/zh-CN/src/unsafe/intro.md:
--------------------------------------------------------------------------------
1 | # Unsafe doing
2 |
--------------------------------------------------------------------------------
/zh-CN/src/variables.md:
--------------------------------------------------------------------------------
1 | # 变量绑定与解构
2 |
3 | ### 绑定和可变性
4 | 1. 🌟 变量只有在初始化后才能被使用
5 |
6 | ```rust,editable
7 |
8 | // 修复下面代码的错误并尽可能少的修改
9 | fn main() {
10 | let x: i32; // 未初始化,但被使用
11 | let y: i32; // 未初始化,也未被使用
12 | println!("x is equal to {}", x);
13 | }
14 | ```
15 |
16 | 2. 🌟🌟 可以使用 `mut` 将变量标记为可变
17 | ```rust,editable
18 |
19 | // 完形填空,让代码编译
20 | fn main() {
21 | let __ = 1;
22 | __ += 2;
23 |
24 | println!("x = {}", x);
25 | }
26 | ```
27 |
28 | ### 变量作用域
29 | 3. 🌟 作用域是一个变量在程序中能够保持合法的范围
30 |
31 | ```rust,editable
32 |
33 | // 修复下面代码的错误并使用尽可能少的改变
34 | fn main() {
35 | let x: i32 = 10;
36 | {
37 | let y: i32 = 5;
38 | println!("x 的值是 {}, y 的值是 {}", x, y);
39 | }
40 | println!("x 的值是 {}, y 的值是 {}", x, y);
41 | }
42 | ```
43 |
44 | 4. 🌟🌟
45 |
46 | ```rust,editable
47 | // 修复错误
48 | fn main() {
49 | println!("{}, world", x);
50 | }
51 |
52 | fn define_x() {
53 | let x = "hello";
54 | }
55 | ```
56 |
57 | ### 变量遮蔽( Shadowing )
58 | 5. 🌟🌟 若后面的变量声明的名称和之前的变量相同,则我们说:第一个变量被第二个同名变量遮蔽了( shadowing )
59 |
60 | ```rust,editable
61 |
62 | // 只允许修改 `assert_eq!` 来让 `println!` 工作(在终端输出 `42`)
63 | fn main() {
64 | let x: i32 = 5;
65 | {
66 | let x = 12;
67 | assert_eq!(x, 5);
68 | }
69 |
70 | assert_eq!(x, 12);
71 |
72 | let x = 42;
73 | println!("{}", x); // 输出 "42".
74 | }
75 | ```
76 |
77 | 6. 🌟🌟 修改一行代码以通过编译
78 | ```rust,editable
79 |
80 | fn main() {
81 | let mut x: i32 = 1;
82 | x = 7;
83 | // 遮蔽且再次绑定
84 | let x = x;
85 | x += 3;
86 |
87 |
88 | let y = 4;
89 | // 遮蔽
90 | let y = "I can also be bound to text!";
91 | }
92 | ```
93 |
94 | ### 未使用的变量
95 | 7. 使用以下方法来修复编译器输出的 warning :
96 |
97 | - 🌟 一种方法
98 | - 🌟🌟 两种方法
99 |
100 | > 注意: 你可以使用两种方法解决,但是它们没有一种是移除 `let x = 1` 所在的代码行
101 |
102 | ```rust,editable
103 |
104 | fn main() {
105 | let x = 1;
106 | }
107 |
108 | // compiler warning: unused variable: `x`
109 | ```
110 |
111 | ### 变量解构
112 | 8. 🌟🌟 我们可以将 `let` 跟一个模式一起使用来解构一个元组,最终将它解构为多个独立的变量
113 |
114 | > 提示: 可以使用变量遮蔽或可变性
115 |
116 | ```rust,editable
117 |
118 | // 修复下面代码的错误并尽可能少的修改
119 | fn main() {
120 | let (x, y) = (1, 2);
121 | x += 2;
122 |
123 | assert_eq!(x, 3);
124 | assert_eq!(y, 2);
125 | }
126 | ```
127 |
128 | ### 解构式赋值
129 | 该功能于 Rust 1.59 版本引入:你可以在赋值语句的左式中使用元组、切片或结构体进行匹配赋值。
130 |
131 | 9. 🌟🌟
132 |
133 | > Note: 解构式赋值只能在 Rust 1.59 或者更高版本中使用
134 |
135 | ```rust,editable
136 |
137 | fn main() {
138 | let (x, y);
139 | (x,..) = (3, 4);
140 | [.., y] = [1, 2];
141 | // 填空,让代码工作
142 | assert_eq!([x,y], __);
143 | }
144 | ```
145 |
146 | > [答案](https://github.com/sunface/rust-by-practice/blob/master/solutions/variables.md) 在 solutions 下面
147 |
--------------------------------------------------------------------------------
/zh-CN/src/weak.md:
--------------------------------------------------------------------------------
1 | # Weak and Circle reference
2 |
--------------------------------------------------------------------------------
/zh-CN/src/why-exercise.md:
--------------------------------------------------------------------------------
1 | Rust语言实战
2 |
3 |
4 |

5 |
6 |
7 | 通过有挑战性的示例、练习题、实践项目来提升 Rust 水平,建立从入门学习到上手实战的直通桥梁
8 |
9 |
10 |
11 | [](https://github.com/sunface/rust-by-practice/stargazers) [](https://github.com/naaive/orange/network/members)
12 | [](https://github.com/sunface/rust-by-practice/blob/master/LICENSE)
13 |
14 |
15 | *Rust语言实战* 的目标是通过大量的实战练习帮助大家更好的学习和上手使用 Rust 语言。书中的练习题非常易于使用:你所需的就是在线完成练习,并让它通过编译。
16 |
17 |
18 | ## 在线阅读
19 |
20 | - [https://zh.practice.rs](https://zh.practice.rs)
21 |
22 | ## 本地运行
23 |
24 | 我们使用 [mdbook](https://rust-lang.github.io/mdBook/) 构建在线练习题,你也可以下载到本地运行:
25 | ```shell
26 | $ git clone https://github.com/sunface/rust-by-practice
27 | $ cargo install mdbook
28 | $ cd rust-by-practice && mdbook serve zh-CN/
29 | ```
30 | 在本地win 10或者linux服务器上运行时,应当使用 -n 参数指定mdbook服务所监听的IP地址(-p 参数指定服务监听的端口,不指定则为默认的3000),以win 10本地运行为例:
31 | ```shell
32 | $ mdbook serve -p 8888 -n 127.0.0.1 zh-CN/
33 | ```
34 | ## 特性
35 |
36 | 部分示例和习题借鉴了 [Rust By Example](https://github.com/rust-lang/rust-by-example), 书中的示例真的非常棒!
37 |
38 | 尽管它们非常优秀,我们这本书也有自己的秘密武器 :)
39 |
40 | - 每个章节分为三个可选部分:示例、练习和实践项目
41 |
42 | - 除了示例外,我们还有大量的高质量练习题,你可以在线阅读、修改和编译它们
43 |
44 | - 覆盖了 Rust 语言的几乎所有方面:基础语言特性、高级语言特性、async/await 异步编程、多线程、并发原语、性能优化、工具链使用、标准库、数据结构和算法等
45 |
46 | - 每一道练习题都提供了解答
47 |
48 | - 整体难度相对更高,更加贴近于实战难度: 简单 🌟 , 中等 🌟🌟 , 困难 🌟🌟🌟 , 地狱 🌟🌟🌟🌟
49 |
50 | **总之,我们想做的就是解决入门学习后,不知道该如何运用的问题,毕竟对于 Rust 来说,从学习到实战,中间还隔着数个 Go语言 的难度**
51 |
52 | ## 关于我们
53 |
54 | *Rust语言实战* 由 Rust 编程学院倾情打造。
55 |
56 | 同时我们还提供了一本目前最好也是最用心的开源 Rust 书籍 - [Rust语言圣经](https://github.com/sunface/rust-course), 适合从入门到精通所有阶段的学习,欢迎大家阅读使用。
57 |
58 | 对我们来说,来自读者大大的肯定比什么都重要,因此一个 [Github star](https://github.com/sunface/rust-by-practice) 要比一杯咖啡更让我们开心,而且现在它在跳楼打折,无需 998 , 仅需 0 元钱 :)
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/zh-CN/theme/style1.css:
--------------------------------------------------------------------------------
1 | @media only screen and (max-width:1080px) {
2 | .sidetoc {
3 | display: none !important;
4 | }
5 | }
6 |
7 | @media only screen and (min-width:1080px) {
8 | main {
9 | position: relative;
10 | padding-right: 170px;
11 | }
12 | .sidetoc {
13 | margin-left: auto;
14 | margin-right: auto;
15 | /*left: calc(100% + (var(--content-max-width))/4 - 180px);*/
16 | left: calc(100% - 200px);
17 | position: absolute;
18 | }
19 | .pagetoc {
20 | position: fixed;
21 | width: 200px;
22 | height: calc(100vh - var(--menu-bar-height) - 10rem);
23 | overflow: auto;
24 | z-index: 1000;
25 | }
26 | .pagetoc a {
27 | border-left: 1px solid var(--sidebar-bg);
28 | color: var(--fg) !important;
29 | display: block;
30 | padding-bottom: 5px;
31 | padding-top: 5px;
32 | padding-left: 10px;
33 | text-align: left;
34 | text-decoration: none;
35 | font-size: 1.2rem;
36 | }
37 | .pagetoc a:hover,
38 | .pagetoc a.active {
39 | background: var(--sidebar-bg);
40 | color: var(--sidebar-fg) !important;
41 | }
42 | .pagetoc .active {
43 | background: var(--sidebar-bg);
44 | color: var(--sidebar-fg);
45 | }
46 | }
47 |
48 | .page-footer {
49 | margin-top: 50px;
50 | border-top: 1px solid #ccc;
51 | overflow: hidden;
52 | padding: 10px 0;
53 | color: gray;
54 | }
55 |
56 | /* 修改章节目录的间距 */
57 | .chapter li.chapter-item {
58 | /* 没有文件时的文字颜色 */
59 | color: #939da3;
60 | margin-top: 1rem;
61 | }
62 |
63 | /* 修改滚动条宽度 */
64 | ::-webkit-scrollbar {
65 | width: 5px;
66 | height: 5px;
67 | }
68 |
69 | /* 表格靠左对齐 */
70 | table {
71 | margin-left: 0 !important;
72 | }
73 |
74 | /* 只使用底部的页面跳转,因为左右两边的宽跳转会被 page-toc 遮盖 */
75 | @media only screen and (max-width: 2560px) {
76 | .nav-wide-wrapper { display: none; }
77 | .nav-wrapper { display: block; }
78 | }
79 | @media only screen and (max-width: 2560px) {
80 | .sidebar-visible .nav-wide-wrapper { display: none; }
81 | .sidebar-visible .nav-wrapper { display: block; }
82 | }
83 |
84 | /* 修复可编辑代码框顶部过窄的问题 */
85 | code.editable, .ace_scroller {
86 | top: 10px;
87 | }
--------------------------------------------------------------------------------