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}*/