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}