1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
pub mod variable {
    fn mutable() {
        let mut mutable_var = 100;
        println!("before mutable var modify: {mutable_var}");
        mutable_var = 20;
        let immutable_var = 100;
        /*
        取消下行注释编译出错
        error[E0384]: cannot assign twice to immutable variable `immutable_var`
            --> src/basic_concept/basic_concept.rs:7:9
           |
         6 |         let immutable_var = 100;
           |             -------------
           |             |
           |             first assignment to `immutable_var`
           |             help: consider making this binding mutable: `mut immutable_var`
         7 |         immutable_var = 20;
           |         ^^^^^^^^^^^^^^^^^^ cannot assign twice to immutable variable
        */
        // immutable_var = 20;
        println!("mutable_var: {mutable_var} immtable_var: {immutable_var}");
    }

    fn constants_test() {
        const WEI: u64 = 1000000000000000000;
        let max64_int = 2 ^ 64 - 1;
        match WEI <= u64::MAX {
            true => println!("WEI lessEqual 2^64-1."),
            false => println!("WEI greater 2^64-1."),
        }
        println!("ethereum WEI {WEI}");
        /*
        若放开下面的注释将报错
        error: const globals cannot be mutable
           --> src/basic_concept/basic_concept.rs:33:15
           |
        33 |         const mut G_WEI:u32 = 1000000000;
           |         ----- ^^^ cannot be mutable
           |         |
           |         help: you might want to declare a static instead: `static`
           error: could not compile `study-rust-example` (bin "study-rust-example") due to previous error*/
        // const mut G_WEI:u32 = 1000000000;
    }

    fn name_scope() {
        let x: u16 = 10086;
        println!("x = {x}"); // x = 10086
        let x: u16 = 100;
        println!("x = {x}"); // x = 100
        {
            let x = x * 2;
            println!("inner scope x = {x}"); // output: inner scope x = 200
        }
        let x = "update string.";
        println!("x = {x}"); // x = update string.
    }

    fn diff_scope_mut() {
        let mut x: u16 = 10000;
        x = 10086;
        // x = 10086
        println!("x = {x}");
        /*
        若打开下一行注释
        error[E0308]: mismatched types
            --> src/basic_concept/basic_concept.rs:62:14
              |
           59 |         let mut x :u16  = 10000;
              |                    --- expected due to this type
            ...
           62 |          x = "update string.";
              |              ^^^^^^^^^^^^^^^^ expected `u16`, found `&str`
         For more information about this error, try `rustc --explain E0308`.
        */
        // x = "update string.";
        let x = "update string.";
        println!("x = {x}"); // x = update string.
    }

    pub fn test_variable() {
        mutable();
        constants_test();
        name_scope();
        diff_scope_mut();
    }
}

pub mod data_types {
    fn data_type_define() {
        /*
        如果不明确指定类型将编译告错如下
        error[E0282]: type annotations needed
          --> src/basic_concept/basic_concept.rs:90:13
           |
        90 |         let var= "32".parse().expect("string not a number.");
           |             ^^^
           |
        help: consider giving `var` an explicit type
           |
        90 |         let var: /* Type */= "32".parse().expect("string not a number.");
           |                ++++++++++++
        For more information about this error, try `rustc --explain E0282`.
        */
        let var: u16 = "32".parse().expect("string not a number.");
        println!("var {var}");
    }

    fn int_type_handle() {
        // 赋值
        let int1: u32 = 100_2400;
        let int2 = 1000_8600;
        let int3: i16 = -32;
        let int4: u8 = b'A';
        println!("int1: {int1}, int2: {int2}, int3: {int3}, int4: {int4}");
        // 算术操作
        let result1 = int1 + 32;
        let result2 = int2 * 10;
        let result3 = int3 - 32;
        let result4 = int4 / 8;
        let result5 = int4 % 8;
        println!("result1: {result1}, result2: {result2}, result3: {result3}, result4: {result4}, result5: {result5}");
    }

    fn char_type_handle() {
        let c = 'z';
        let z: char = 'ℤ';
        let heart_eyed_cat = '😻';
        println!("c {c}, z {z} heart_eyed_cat {heart_eyed_cat}");
    }

    fn scalar_type_handle() {
        int_type_handle();
        char_type_handle();
    }

    fn tuple_type_handle() {
        let tup: (u16, i32, bool, char) = (18, -32, false, 'a');
        println!("tup: ({{tup.0}}, {{tup.1}}, {{tup.2}}, {{tup.3}})"); // tup: ( {tup.0}, {tup.1}, {tup.2}, {tup.3})
        let ele = tup.1;
        println!("tup.1 {ele}");
        let (x, y, z, a) = tup;
        println!("tup x: {x}, y: {y}, z: {z}, a: {a}"); // tup x: 18, y: -32, z: false, a: a
    }

    fn array_type_handle() {
        let a0 = [0, 1, 2, 3, 4, 5, 6];
        // 定义类型为i32长度为8的数组;
        let a1: [i32; 8] = [32, 35, 35, 78, 98, 48, 34, 66];
        let a2 = [88; 10];
        for ele in a0 {
            print!("{ele} ");
        }
        println!();
        for num in (0..a1.len()) {
            let ele = a1[num];
            print!("a1[{num}]: {ele} ");
        }
        println!();
        let mut index = 0;
        // 访问数组越界时候:
        /*
        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
        note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
        */
        while index <= a2.len() {
            let ele = a2[index];
            print!("a2[{index}]: {ele} ");
            index += 1;
        }
    }

    fn compound_type_handle() {
        tuple_type_handle();
        array_type_handle();
    }

    pub fn test_data_types() {
        data_type_define();
        scalar_type_handle();
        compound_type_handle();
    }
}

pub mod function {
    fn test_expression_statements(value: u16, flag: char) -> u16 {
        let y = {
            let x = value / 2;
            x + 1 // 没有分号
        };
        println!("value= {value}, y= {y}, flag: {flag}"); // value= 32, y= 17, flag: E
        return y;
    }

    // 最简化操作;
    fn double_input(input: u16) -> u16 {
        // 与下面注释的语句等效
        input * 2
        // return input * 2;
    }

    pub fn test_function_handle() {
        let rslt1 = test_expression_statements(32, 'E');
        println!("result {rslt1}");
        let rslt2 = double_input(rslt1);
        println!("result {rslt2}");
    }
}

pub mod control_flow {
    fn test_if() {
        let flag = false;
        if flag {
            println!("condition is True.");
        } else {
            println!("condition is false.");
        }
        let flag = 3;
        /*error[E0308]: mismatched types
          --> src/basic_concept/basic_concept.rs:218:12
           |
          218 |         if flag {
           |            ^^^^ expected `bool`, found integer
            For more information about this error, try `rustc --explain E0308`.
        */
        /*if flag {
            println!("condition is True.");
        } else {
            println!("condition is false.");
        }*/
        if flag <= 1 {
            println!("flag is lessEqual than 1.");
        } else if flag <= 2 {
            println!("flag is lessEqual than 2.");
        } else if flag <= 3 {
            println!("flag is lessEqual than 3.");
        } else {
            println!("flag is greater than 1.");
        }
        // 条件赋值
        let condition = false;
        // 每个分支返回的类型一定是要一致的;应该是好处是编译期间就能确定类型
        let num = if condition { 18 } else { 314 };
        println!("{num}");
    }

    pub fn test_loop_handle() {
        let mut num = 1;
        let result = loop {
            num += 1;
            if num == 10 {
                break num * 2;
            }
        };
        println!("result {result}");
        'out_loop: loop {
            let mut remainder = 10;
            loop {
                if remainder == 9 {
                    println!("num = {num}, remainder = {remainder}");
                    break;
                }
                // 指定循环退出;
                if num > 26 {
                    println!("2 num = {num}, remainder = {remainder}");
                    break 'out_loop;
                }
                remainder -= 1;
            }
            num += 1;
        }
    }

    fn test_while_handle() {
        let mut num = 100;
        while num <= 108 {
            num += 10;
            println!("{num}");
        }
    }

    fn test_for_handle() {
        let array: [u16; 5] = [12, 34, 56, 67, 787];
        for ele in array {
            print!("{ele} ");
        }
        println!();
        for i in 0..array.len() {
            let ele = array[i];
            print!("{ele} ");
        }
    }

    pub fn test_control_flow_handle() {
        test_if();
        test_loop_handle();
        test_while_handle();
        test_for_handle();
    }
}