结构体 #
一、结构体定义 #
1.1 基本语法 #
rust
struct User {
username: String,
email: String,
active: bool,
sign_in_count: u64,
}
fn main() {
let user = User {
username: String::from("alice"),
email: String::from("alice@example.com"),
active: true,
sign_in_count: 1,
};
println!("Username: {}", user.username);
}
1.2 可变实例 #
rust
fn main() {
let mut user = User {
username: String::from("alice"),
email: String::from("alice@example.com"),
active: true,
sign_in_count: 1,
};
user.email = String::from("new@example.com");
println!("Email: {}", user.email);
}
1.3 字段初始化简写 #
rust
fn build_user(username: String, email: String) -> User {
User {
username, // 简写
email, // 简写
active: true,
sign_in_count: 1,
}
}
1.4 结构体更新语法 #
rust
fn main() {
let user1 = User {
username: String::from("alice"),
email: String::from("alice@example.com"),
active: true,
sign_in_count: 1,
};
let user2 = User {
username: String::from("bob"),
..user1 // 其余字段来自 user1
};
println!("user2 email: {}", user2.email);
}
二、元组结构体 #
2.1 定义 #
rust
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
fn main() {
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
println!("Black: ({}, {}, {})", black.0, black.1, black.2);
}
2.2 解构 #
rust
fn main() {
let color = Color(255, 128, 0);
let Color(r, g, b) = color;
println!("RGB: ({}, {}, {})", r, g, b);
}
三、单元结构体 #
rust
struct AlwaysEqual;
fn main() {
let _subject = AlwaysEqual;
}
四、方法 #
4.1 定义方法 #
rust
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn perimeter(&self) -> u32 {
2 * (self.width + self.height)
}
}
fn main() {
let rect = Rectangle {
width: 30,
height: 50,
};
println!("Area: {}", rect.area());
println!("Perimeter: {}", rect.perimeter());
}
4.2 可变方法 #
rust
impl Rectangle {
fn scale(&mut self, factor: u32) {
self.width *= factor;
self.height *= factor;
}
}
fn main() {
let mut rect = Rectangle {
width: 10,
height: 20,
};
rect.scale(2);
println!("Width: {}, Height: {}", rect.width, rect.height);
}
4.3 关联函数 #
rust
impl Rectangle {
fn new(width: u32, height: u32) -> Self {
Rectangle { width, height }
}
fn square(size: u32) -> Self {
Rectangle {
width: size,
height: size,
}
}
}
fn main() {
let rect = Rectangle::new(10, 20);
let square = Rectangle::square(5);
println!("Rect area: {}", rect.area());
println!("Square area: {}", square.area());
}
4.4 多个 impl 块 #
rust
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
}
impl Rectangle {
fn perimeter(&self) -> u32 {
2 * (self.width + self.height)
}
}
五、派生 trait #
5.1 Debug #
rust
#[derive(Debug)]
struct User {
username: String,
email: String,
}
fn main() {
let user = User {
username: String::from("alice"),
email: String::from("alice@example.com"),
};
println!("{:?}", user);
println!("{:#?}", user);
}
5.2 常用派生 #
rust
#[derive(Debug, Clone, PartialEq)]
struct Point {
x: i32,
y: i32,
}
fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = p1.clone();
println!("{:?}", p1);
println!("p1 == p2: {}", p1 == p2);
}
六、实践示例 #
6.1 银行账户 #
rust
#[derive(Debug)]
struct BankAccount {
owner: String,
balance: f64,
}
impl BankAccount {
fn new(owner: &str, initial_balance: f64) -> Self {
BankAccount {
owner: owner.to_string(),
balance: initial_balance,
}
}
fn deposit(&mut self, amount: f64) {
self.balance += amount;
}
fn withdraw(&mut self, amount: f64) -> Result<(), String> {
if amount > self.balance {
Err(String::from("余额不足"))
} else {
self.balance -= amount;
Ok(())
}
}
fn get_balance(&self) -> f64 {
self.balance
}
}
fn main() {
let mut account = BankAccount::new("Alice", 1000.0);
account.deposit(500.0);
println!("存款后余额: {}", account.get_balance());
match account.withdraw(200.0) {
Ok(()) => println!("取款成功,余额: {}", account.get_balance()),
Err(e) => println!("取款失败: {}", e),
}
}
6.2 图书管理 #
rust
#[derive(Debug, Clone)]
struct Book {
title: String,
author: String,
pages: u32,
available: bool,
}
impl Book {
fn new(title: &str, author: &str, pages: u32) -> Self {
Book {
title: title.to_string(),
author: author.to_string(),
pages,
available: true,
}
}
fn borrow_book(&mut self) -> Result<(), String> {
if self.available {
self.available = false;
Ok(())
} else {
Err(format!("《{}》已被借出", self.title))
}
}
fn return_book(&mut self) {
self.available = true;
}
}
fn main() {
let mut book = Book::new("Rust编程", "Steve", 500);
println!("{:?}", book);
book.borrow_book().unwrap();
println!("借出后: {:?}", book);
book.return_book();
println!("归还后: {:?}", book);
}
七、总结 #
本章学习了:
- 结构体定义和实例化
- 字段访问和修改
- 方法定义
- 关联函数
- 派生 trait
下一章,我们将学习枚举。
最后更新:2026-03-27