study_rust_example/basic_concept/basic_concept.rs
1pub mod variable {
2 fn mutable() {
3 let mut mutable_var = 100;
4 println!("before mutable var modify: {mutable_var}");
5 mutable_var = 20;
6 let immutable_var = 100;
7 /*
8 取消下行注释编译出错
9 error[E0384]: cannot assign twice to immutable variable `immutable_var`
10 --> src/basic_concept/basic_concept.rs:7:9
11 |
12 6 | let immutable_var = 100;
13 | -------------
14 | |
15 | first assignment to `immutable_var`
16 | help: consider making this binding mutable: `mut immutable_var`
17 7 | immutable_var = 20;
18 | ^^^^^^^^^^^^^^^^^^ cannot assign twice to immutable variable
19 */
20 // immutable_var = 20;
21 println!("mutable_var: {mutable_var} immtable_var: {immutable_var}");
22 }
23
24 fn constants_test() {
25 const WEI: u64 = 1000000000000000000;
26 let max64_int = 2 ^ 64 - 1;
27 match WEI <= u64::MAX {
28 true => println!("WEI lessEqual 2^64-1."),
29 false => println!("WEI greater 2^64-1."),
30 }
31 println!("ethereum WEI {WEI}");
32 /*
33 若放开下面的注释将报错
34 error: const globals cannot be mutable
35 --> src/basic_concept/basic_concept.rs:33:15
36 |
37 33 | const mut G_WEI:u32 = 1000000000;
38 | ----- ^^^ cannot be mutable
39 | |
40 | help: you might want to declare a static instead: `static`
41 error: could not compile `study-rust-example` (bin "study-rust-example") due to previous error*/
42 // const mut G_WEI:u32 = 1000000000;
43 }
44
45 fn name_scope() {
46 let x: u16 = 10086;
47 println!("x = {x}"); // x = 10086
48 let x: u16 = 100;
49 println!("x = {x}"); // x = 100
50 {
51 let x = x * 2;
52 println!("inner scope x = {x}"); // output: inner scope x = 200
53 }
54 let x = "update string.";
55 println!("x = {x}"); // x = update string.
56 }
57
58 fn diff_scope_mut() {
59 let mut x: u16 = 10000;
60 x = 10086;
61 // x = 10086
62 println!("x = {x}");
63 /*
64 若打开下一行注释
65 error[E0308]: mismatched types
66 --> src/basic_concept/basic_concept.rs:62:14
67 |
68 59 | let mut x :u16 = 10000;
69 | --- expected due to this type
70 ...
71 62 | x = "update string.";
72 | ^^^^^^^^^^^^^^^^ expected `u16`, found `&str`
73 For more information about this error, try `rustc --explain E0308`.
74 */
75 // x = "update string.";
76 let x = "update string.";
77 println!("x = {x}"); // x = update string.
78 }
79
80 pub fn test_variable() {
81 mutable();
82 constants_test();
83 name_scope();
84 diff_scope_mut();
85 }
86}
87
88pub mod data_types {
89 fn data_type_define() {
90 /*
91 如果不明确指定类型将编译告错如下
92 error[E0282]: type annotations needed
93 --> src/basic_concept/basic_concept.rs:90:13
94 |
95 90 | let var= "32".parse().expect("string not a number.");
96 | ^^^
97 |
98 help: consider giving `var` an explicit type
99 |
100 90 | let var: /* Type */= "32".parse().expect("string not a number.");
101 | ++++++++++++
102 For more information about this error, try `rustc --explain E0282`.
103 */
104 let var: u16 = "32".parse().expect("string not a number.");
105 println!("var {var}");
106 }
107
108 fn int_type_handle() {
109 // 赋值
110 let int1: u32 = 100_2400;
111 let int2 = 1000_8600;
112 let int3: i16 = -32;
113 let int4: u8 = b'A';
114 println!("int1: {int1}, int2: {int2}, int3: {int3}, int4: {int4}");
115 // 算术操作
116 let result1 = int1 + 32;
117 let result2 = int2 * 10;
118 let result3 = int3 - 32;
119 let result4 = int4 / 8;
120 let result5 = int4 % 8;
121 println!("result1: {result1}, result2: {result2}, result3: {result3}, result4: {result4}, result5: {result5}");
122 }
123
124 fn char_type_handle() {
125 let c = 'z';
126 let z: char = 'ℤ';
127 let heart_eyed_cat = '😻';
128 println!("c {c}, z {z} heart_eyed_cat {heart_eyed_cat}");
129 }
130
131 fn scalar_type_handle() {
132 int_type_handle();
133 char_type_handle();
134 }
135
136 fn tuple_type_handle() {
137 let tup: (u16, i32, bool, char) = (18, -32, false, 'a');
138 println!("tup: ({{tup.0}}, {{tup.1}}, {{tup.2}}, {{tup.3}})"); // tup: ( {tup.0}, {tup.1}, {tup.2}, {tup.3})
139 let ele = tup.1;
140 println!("tup.1 {ele}");
141 let (x, y, z, a) = tup;
142 println!("tup x: {x}, y: {y}, z: {z}, a: {a}"); // tup x: 18, y: -32, z: false, a: a
143 }
144
145 fn array_type_handle() {
146 let a0 = [0, 1, 2, 3, 4, 5, 6];
147 // 定义类型为i32长度为8的数组;
148 let a1: [i32; 8] = [32, 35, 35, 78, 98, 48, 34, 66];
149 let a2 = [88; 10];
150 for ele in a0 {
151 print!("{ele} ");
152 }
153 println!();
154 for num in (0..a1.len()) {
155 let ele = a1[num];
156 print!("a1[{num}]: {ele} ");
157 }
158 println!();
159 let mut index = 0;
160 // 访问数组越界时候:
161 /*
162 thread 'main' panicked at 'index out of bounds: the len is 10 but the index is 10', src/basic_concept/basic_concept.rs:161:23
163 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
164 */
165 while index <= a2.len() {
166 let ele = a2[index];
167 print!("a2[{index}]: {ele} ");
168 index += 1;
169 }
170 }
171
172 fn compound_type_handle() {
173 tuple_type_handle();
174 array_type_handle();
175 }
176
177 pub fn test_data_types() {
178 data_type_define();
179 scalar_type_handle();
180 compound_type_handle();
181 }
182}
183
184pub mod function {
185 fn test_expression_statements(value: u16, flag: char) -> u16 {
186 let y = {
187 let x = value / 2;
188 x + 1 // 没有分号
189 };
190 println!("value= {value}, y= {y}, flag: {flag}"); // value= 32, y= 17, flag: E
191 return y;
192 }
193
194 // 最简化操作;
195 fn double_input(input: u16) -> u16 {
196 // 与下面注释的语句等效
197 input * 2
198 // return input * 2;
199 }
200
201 pub fn test_function_handle() {
202 let rslt1 = test_expression_statements(32, 'E');
203 println!("result {rslt1}");
204 let rslt2 = double_input(rslt1);
205 println!("result {rslt2}");
206 }
207}
208
209pub mod control_flow {
210 fn test_if() {
211 let flag = false;
212 if flag {
213 println!("condition is True.");
214 } else {
215 println!("condition is false.");
216 }
217 let flag = 3;
218 /*error[E0308]: mismatched types
219 --> src/basic_concept/basic_concept.rs:218:12
220 |
221 218 | if flag {
222 | ^^^^ expected `bool`, found integer
223 For more information about this error, try `rustc --explain E0308`.
224 */
225 /*if flag {
226 println!("condition is True.");
227 } else {
228 println!("condition is false.");
229 }*/
230 if flag <= 1 {
231 println!("flag is lessEqual than 1.");
232 } else if flag <= 2 {
233 println!("flag is lessEqual than 2.");
234 } else if flag <= 3 {
235 println!("flag is lessEqual than 3.");
236 } else {
237 println!("flag is greater than 1.");
238 }
239 // 条件赋值
240 let condition = false;
241 // 每个分支返回的类型一定是要一致的;应该是好处是编译期间就能确定类型
242 let num = if condition { 18 } else { 314 };
243 println!("{num}");
244 }
245
246 pub fn test_loop_handle() {
247 let mut num = 1;
248 let result = loop {
249 num += 1;
250 if num == 10 {
251 break num * 2;
252 }
253 };
254 println!("result {result}");
255 'out_loop: loop {
256 let mut remainder = 10;
257 loop {
258 if remainder == 9 {
259 println!("num = {num}, remainder = {remainder}");
260 break;
261 }
262 // 指定循环退出;
263 if num > 26 {
264 println!("2 num = {num}, remainder = {remainder}");
265 break 'out_loop;
266 }
267 remainder -= 1;
268 }
269 num += 1;
270 }
271 }
272
273 fn test_while_handle() {
274 let mut num = 100;
275 while num <= 108 {
276 num += 10;
277 println!("{num}");
278 }
279 }
280
281 fn test_for_handle() {
282 let array: [u16; 5] = [12, 34, 56, 67, 787];
283 for ele in array {
284 print!("{ele} ");
285 }
286 println!();
287 for i in 0..array.len() {
288 let ele = array[i];
289 print!("{ele} ");
290 }
291 }
292
293 pub fn test_control_flow_handle() {
294 test_if();
295 test_loop_handle();
296 test_while_handle();
297 test_for_handle();
298 }
299}