Rust中的Enum與Struct示例詳解
在 Rust 中,struct(結(jié)構(gòu)體)和enum(枚舉)是兩種核心的自定義類型,分別用于組合相關(guān)數(shù)據(jù)和表示互斥的可能性。
結(jié)構(gòu)體struct
struct用于將多個(gè)相關(guān)的值組合在一起,形成一個(gè)有意義的組
具名結(jié)構(gòu)體(named strcut)
最常用的結(jié)構(gòu)體形式,字段有明確的名稱,可讀性強(qiáng),適合數(shù)據(jù)含義明確的場(chǎng)景。
- 字段默認(rèn)私有(僅當(dāng)前模塊內(nèi)可見(jiàn))
- 通過(guò)impl實(shí)現(xiàn)關(guān)聯(lián)函數(shù)(方法)
- 通過(guò)
..實(shí)現(xiàn)賦值(所有未指定的字段,全部替換為…對(duì)應(yīng)變量中的):若字段為移動(dòng)語(yǔ)義,所有權(quán)被移走 - 通過(guò)trait實(shí)現(xiàn)多態(tài)(參見(jiàn)《Rust中的特征Trait》)
use std::fmt;
pub struct Person {
pub name: String,
age: u8,
active: bool,
}
impl fmt::Display for Person {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Person {{ name: {}, age: {}, active: {} }}", self.name, self.age, self.active)
}
}
fn main() {
let alice = Person { name: String::from("Alice"), age: 30, active: true };
let mike = Person { name: String::from("Mike"), ..alice };
println!("person: {}", mike);
// 解結(jié)構(gòu)與..
let Person { name, .. } = mike;
println!("name: {}", name);
}可見(jiàn)性
默認(rèn)為私有,可通過(guò)pub修飾符修改:
| 修飾符 | 可見(jiàn)范圍 | 說(shuō)明 |
|---|---|---|
pub | 全局可見(jiàn)(跨 crate) | 完全公開(kāi) |
pub(crate) | 整個(gè)當(dāng)前 crate 內(nèi)可見(jiàn) | 庫(kù)內(nèi)部共享 |
pub(super) | 父模塊可見(jiàn) | 子模塊輔助函數(shù) |
pub(in path) | 指定模塊路徑內(nèi)可見(jiàn) | 最靈活的控制 |
| (無(wú)修飾) | 當(dāng)前模塊私有 | 默認(rèn)私有 |
trait(繼承/多態(tài))
Rust 沒(méi)有傳統(tǒng) OOP 的類繼承(沒(méi)有基類/子類)。用 trait + impl 來(lái)實(shí)現(xiàn)接口/多態(tài)。
trait定義方法簽名集合,實(shí)現(xiàn)trait的類必須提供所有對(duì)應(yīng)方法:
- 靜態(tài)分發(fā)(
T: Trait)在編譯期確定具體類型(單態(tài)化,性能好)。 - 動(dòng)態(tài)分發(fā)(
&dyn Trait或Box<dyn Trait>)通過(guò)虛函數(shù)表(vtable),在運(yùn)行時(shí)分發(fā)(適合異構(gòu)集合/插件式架構(gòu))。
trait Drawable {
fn draw(&self);
}
struct Circle { radius: f64 }
struct Square { side: f64 }
impl Drawable for Circle {
fn draw(&self) { println!("circle r={}", self.radius); }
}
impl Drawable for Square {
fn draw(&self) { println!("square s={}", self.side); }
}
// 靜態(tài)分發(fā)(泛型)
fn draw_all<T: Drawable>(items: &[T]) {
for item in items { item.draw(); }
}
// 動(dòng)態(tài)分發(fā)(trait object)
fn draw_box(items: &[Box<dyn Drawable>]) {
for item in items { item.draw(); }
}泛型與生命周期
結(jié)構(gòu)體可以是泛型的(參見(jiàn)《Rust中的泛型Generics》),也可以帶生命周期參數(shù)。
struct Holder<'a, T> { r: &'a T, val: T }
struct Pair<T, U>(T, U);泛型說(shuō)明:
| 特性 | 說(shuō)明 |
|---|---|
struct Point<T> | 定義泛型結(jié)構(gòu)體 |
impl<T> Point<T> | 為所有類型實(shí)現(xiàn)方法 |
impl Point<i32> | 為特定類型實(shí)現(xiàn)方法 |
T: Display | 泛型約束,要求類型實(shí)現(xiàn)Displaytrait |
where T: Clone, U: Debug | 泛型約束,更清晰的約束語(yǔ)法 |
元組結(jié)構(gòu)體(tuple struct)
字段沒(méi)有名稱,僅通過(guò)位置區(qū)分,適合數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單、字段含義可通過(guò)位置推斷的場(chǎng)景。
// 元組結(jié)構(gòu)體:通過(guò)位置區(qū)分(x, y)
struct Point(i32, i32);
// 創(chuàng)建實(shí)例
let p1 = Point(3, 4);
// 訪問(wèn)字段(通過(guò)索引)
println!("x坐標(biāo):{}", p1.0); // 輸出:x坐標(biāo):3單元結(jié)構(gòu)體(unit struct)
一種不包含任何字段的結(jié)構(gòu)體。它的定義形式類似于一個(gè)“空”的結(jié)構(gòu)體:
- 在內(nèi)存中不占用任何空間(
size_of::<UnitStruct>() == 0) - 主要用于標(biāo)記類型(表示 “存在性” 而非 “數(shù)據(jù)”)
// 定義狀態(tài)
pub struct Locked;
pub struct Unlocked;
// 門的結(jié)構(gòu),使用泛型參數(shù)表示狀態(tài)
pub struct Door<TState> {
id: u32,
_state: std::marker::PhantomData<TState>,
}
// 只有 Locked 狀態(tài)才能解鎖
impl Door<Locked> {
fn unlock(self) -> Door<Unlocked> {
println!("門 {} 已解鎖", self.id);
Door {
id: self.id,
_state: std::marker::PhantomData,
}
}
}
// 只有 Unlocked 狀態(tài)才能打開(kāi)
impl Door<Unlocked> {
fn open(&self) {
println!("門 {} 打開(kāi)", self.id);
}
fn lock(self) -> Door<Locked> {
println!("門 {} 已上鎖", self.id);
Door {
id: self.id,
_state: std::marker::PhantomData,
}
}
}
pub fn test_door() {
let door = Door::<Locked> {
id: 101,
_state: std::marker::PhantomData,
};
let door = door.unlock(); // 狀態(tài)轉(zhuǎn)換
door.open(); // Unlocked 狀態(tài)可以打開(kāi)
let door = door.lock(); // 重新上鎖
}枚舉(enum)
枚舉的核心作用是定義一個(gè)類型,其值是有限的、互斥的幾種可能變體(variants)之一。每個(gè)變體可以關(guān)聯(lián)不同類型和數(shù)量的數(shù)據(jù)。
枚舉通過(guò)enum關(guān)鍵字定義,每個(gè)變體可以是 “空” 的,也可以攜帶數(shù)據(jù)(類似元組或結(jié)構(gòu)體)。
// 定義枚舉:消息類型
enum Message {
Quit, // 無(wú)數(shù)據(jù):退出消息
Move { x: i32, y: i32 }, // 具名數(shù)據(jù):移動(dòng)到(x,y)
Write(String), // 元組數(shù)據(jù):寫(xiě)入文本
ChangeColor(i32, i32, i32), // 元組數(shù)據(jù):修改顏色(RGB)
}
// 創(chuàng)建枚舉實(shí)例
let msg1 = Message::Quit; // 退出消息
let msg2 = Message::Move { x: 10, y: 20 }; // 移動(dòng)到(10,20)
let msg3 = Message::Write(String::from("hello")); // 寫(xiě)入"hello"模式匹配
枚舉的核心用法是通過(guò)match表達(dá)式匹配其變體,從而處理不同情況(類似 “多分支條件判斷”,但更安全)。
fn process_message(msg: Message) {
match msg {
Message::Quit => println!("收到退出消息"),
Message::Move { x, y } => println!("移動(dòng)到坐標(biāo):({}, {})", x, y),
Message::Write(text) => println!("寫(xiě)入內(nèi)容:{}", text),
Message::ChangeColor(r, g, b) => println!("修改顏色為 RGB({}, {}, {})", r, g, b),
}
}
process_message(msg2); // 輸出:移動(dòng)到坐標(biāo):(10, 20)
process_message(msg3); // 輸出:寫(xiě)入內(nèi)容:hello常見(jiàn)enum
Option<T>是 Rust 中用于表示 “有值” 或 “無(wú)值” 的枚舉,徹底避免了空指針(Null)問(wèn)題。
enum Option<T> {
Some(T), // 有值:存儲(chǔ)類型為T的值
None, // 無(wú)值
}
Result<T, E>用于表示操作 “成功” 或 “失敗” 的結(jié)果,是 Rust 錯(cuò)誤處理的核心類型。
enum Result<T, E> {
Ok(T), // 成功:存儲(chǔ)類型為T的結(jié)果
Err(E), // 失?。捍鎯?chǔ)類型為E的錯(cuò)誤信息
}
Ordering用于表示兩個(gè)值的比較結(jié)果(小于、等于、大于)
enum Ordering {
Less, // 小于
Equal, // 等于
Greater, // 大于
}
到此這篇關(guān)于Rust中的Enum與Struct示例詳解的文章就介紹到這了,更多相關(guān)Rust Enum與Struct內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust搭建webserver的底層原理與應(yīng)用實(shí)戰(zhàn)技巧
本文介紹Rust在HTTP編程中的應(yīng)用,涵蓋協(xié)議基礎(chǔ)、標(biāo)準(zhǔn)庫(kù)與第三方庫(kù)(如hyper、reqwest)的使用,以及多線程服務(wù)器和線程池的實(shí)現(xiàn)與關(guān)閉機(jī)制,展示Rust在性能、安全和并發(fā)方面的優(yōu)勢(shì),感興趣的朋友跟隨小編一起看看吧2025-06-06
Rust循環(huán)控制結(jié)構(gòu)用法詳解
Rust提供了多種形式的循環(huán)結(jié)構(gòu),每種都適用于不同的場(chǎng)景,在Rust中,循環(huán)有三種主要的形式:loop、while和for,本文將介紹Rust中的這三種循環(huán),并通過(guò)實(shí)例展示它們的用法和靈活性,感興趣的朋友一起看看吧2024-02-02
使用環(huán)境變量實(shí)現(xiàn)Rust程序中的不區(qū)分大小寫(xiě)搜索方式
本文介紹了如何在Rust中實(shí)現(xiàn)不區(qū)分大小寫(xiě)的搜索功能,并通過(guò)測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)方法逐步實(shí)現(xiàn)該功能,通過(guò)修改運(yùn)行函數(shù)和獲取環(huán)境變量,程序可以根據(jù)環(huán)境變量控制搜索模式2025-02-02
在Rust應(yīng)用中訪問(wèn).ini格式的配置文件方式

