study_rust_example/
struct_related.rs

1pub mod retangle;
2
3pub mod define_init_struct; /*{
4                                #[derive(Debug)]
5                                struct User {
6                                    user_id: String,
7                                    user_name: String,
8                                    age: u8,
9                                    active: bool,
10                                }
11
12                                /*
13                                 error[E0106]: missing lifetime specifier
14                                   --> src/struct_related/struct_related.rs:11:20
15                                   |
16                                11 |         user_name: &str,
17                                   |                    ^ expected named lifetime parameter
18                                   |
19                                 help: consider introducing a named lifetime parameter
20                                 */
21                                /*struct UserRef {
22                                    user_id: &str,
23                                    user_name: &str,
24                                    age: u8,
25                                    active: bool,
26                                }*/
27                                // 元组类型不需要命名的地方
28                                struct Color(i32, i32, i32);
29                                struct Point(i32, i32);
30                                fn build_user(user_name: String, user_id: String, age: u8) -> User {
31                                    User {
32                                        user_name,
33                                        user_id,
34                                        age,
35                                        active: true,
36                                    }
37                                }
38                                fn create_user_and_modify(name: &str) -> User {
39                                    let mut user = build_user(String::from("user_name"), String::from("user_id"), 28);
40                                    user.user_name = name.to_string();
41                                    return user;
42                                }
43                                pub fn define_init_struct_study() {
44                                    let name = String::from("Jack");
45                                    let user = create_user_and_modify(&name);
46                                    let user2 = User { age: 18, ..user };
47                                    let color = Color(32, 34, 43);
48                                    let point = Point(23, -23);
49                                    dbg!(&user2);
50                                }
51                            }*/
52
53/*pub mod retangle_struct {
54    // {:?}pretty-print打印时候没有实现`Rectangle` doesn't implement `Debug`
55    #[derive(Debug)]
56    struct Rectangle {
57        width: i32,
58        height: i32,
59    }
60
61    impl Rectangle {
62        fn area(&self) -> i32 {
63            self.width * self.height
64        }
65
66        // move了所有权,调用之后,后续该实例就没法使用;
67        fn get_width(self) -> i32 {
68            self.width
69        }
70
71        fn modify_width(&mut self, new_width: i32) {
72            self.width = new_width;
73        }
74
75        fn valid_width(self: &Self) -> bool {
76            self.width > 0
77        }
78
79        // Associated function,类似于静态方法?
80        fn square(size: i32) -> Self {
81            Self {
82                width: size,
83                height: size,
84            }
85        }
86    }
87
88    pub fn retangle_struct_study() {
89        let mut rect = Rectangle {
90            width: 12,
91            height: 8,
92        };
93        let area_val = rect.area();
94        // 直接打印没有实现标准的std::fmt::Display
95        println!("area val {}, rect {:?}", area_val, rect);
96        if rect.valid_width() {
97            println!("width valid.");
98        }
99        rect.modify_width(-32);
100        println!("area after modify val {}, rect {:?}", rect.area(), rect);
101        let square_val = Rectangle::square(10);
102        println!("square: {:?}", square_val);
103        println!("rect width {}", rect.get_width());
104        // error[E0382]: borrow of moved value: `rect`
105        // rect.area();
106    }
107}*/