楼主:
yam276 ('_')
2025-04-18 10:51:49: https://space.bilibili.com/361469957/lists/3902595
: 从入门到入门
1. struct 语法糖
fn build_user(email: String, username: String) -> User {
User {
active: true,
email,
username,
sign_in_count: 1,
}
只要输入跟 member一样就不用写 email: email, 可以只写 email,
2. struct 复制
let user2 = User {
email: String::from("[email protected]"),
..user1
};
这样代表把 email 指定为特定数值
其他都从 user1 搬运(move) 过来
会转移所有权 所以这行之后 user1 就无法使用了
如果想要 user1 后面有所有权还能使用要用 .clone()
let user2 = User {
email: String::from("[email protected]"),
..user1.clone()
};
3. tuple
struct Color(u8, u8, u8); // 定义一个代表 RGB 颜色的 tuple struct
struct Point(i32, i32, i32); // 定义一个 3D 座标点
fn main() {
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
println!("Black: {}, {}, {}", black.0, black.1, black.2);
println!("Origin: {}, {}, {}", origin.0, origin.1, origin.2);
}
tuple 的成员没有名字 所以要用 struct.0, struct.1 来存取
4. Unit-like struct
代表只有命名没有成员的struct
用法:
(1) 当成 marker
struct Admin;
struct Guest;
fn do_something(user_type: Admin) {
println!("Welcome, Admin!");
}
(2) 实作方法
struct Logger;
impl Logger {
fn log(&self) {
println!("Logging something...");
}
}
fn main() {
let logger = Logger;
logger.log();
}
(3) 跟 enum 搭配
enum Message {
Quit, // Unit-like variant
Move { x: i32, y: i32 }, // Struct-like
Write(String), // Tuple-like
}
5. Derived Trait
#[derive(Debug)]
struct User {
name: String,
}
有很多种 以常用的 Debug 为例
fn main() {
let user1 = User { name: "John".to_string() };
// Debug 的 Derived 让你可以使用 {:?} 输出
println!("User {:?}", user1);
// {:#?} 比较优雅的输出版本 比如输出 struct 会分段缩排
println!("User {:#?}", user1);
}