Rust中的Enum與Struct示例詳解
在 Rust 中,struct(結(jié)構(gòu)體)和enum(枚舉)是兩種核心的自定義類(lèi)型,分別用于組合相關(guān)數(shù)據(jù)和表示互斥的可能性。
結(jié)構(gòu)體struct
struct用于將多個(gè)相關(guān)的值組合在一起,形成一個(gè)有意義的組
具名結(jié)構(gòu)體(named strcut)
最常用的結(jié)構(gòu)體形式,字段有明確的名稱(chēng),可讀性強(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 的類(lèi)繼承(沒(méi)有基類(lèi)/子類(lèi))。用 trait + impl 來(lái)實(shí)現(xiàn)接口/多態(tài)。
trait定義方法簽名集合,實(shí)現(xiàn)trait的類(lèi)必須提供所有對(duì)應(yīng)方法:
- 靜態(tài)分發(fā)(
T: Trait)在編譯期確定具體類(lèi)型(單態(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> | 為所有類(lèi)型實(shí)現(xiàn)方法 |
impl Point<i32> | 為特定類(lèi)型實(shí)現(xiàn)方法 |
T: Display | 泛型約束,要求類(lèi)型實(shí)現(xiàn)Displaytrait |
where T: Clone, U: Debug | 泛型約束,更清晰的約束語(yǔ)法 |
元組結(jié)構(gòu)體(tuple struct)
字段沒(méi)有名稱(chēng),僅通過(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)體。它的定義形式類(lèi)似于一個(gè)“空”的結(jié)構(gòu)體:
- 在內(nèi)存中不占用任何空間(
size_of::<UnitStruct>() == 0) - 主要用于標(biāo)記類(lèi)型(表示 “存在性” 而非 “數(shù)據(jù)”)
// 定義狀態(tài)
pub struct Locked;
pub struct Unlocked;
// 門(mén)的結(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!("門(mén) {} 已解鎖", self.id);
Door {
id: self.id,
_state: std::marker::PhantomData,
}
}
}
// 只有 Unlocked 狀態(tài)才能打開(kāi)
impl Door<Unlocked> {
fn open(&self) {
println!("門(mén) {} 打開(kāi)", self.id);
}
fn lock(self) -> Door<Locked> {
println!("門(mén) {} 已上鎖", 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è)類(lèi)型,其值是有限的、互斥的幾種可能變體(variants)之一。每個(gè)變體可以關(guān)聯(lián)不同類(lèi)型和數(shù)量的數(shù)據(jù)。
枚舉通過(guò)enum關(guān)鍵字定義,每個(gè)變體可以是 “空” 的,也可以攜帶數(shù)據(jù)(類(lèi)似元組或結(jié)構(gòu)體)。
// 定義枚舉:消息類(lèi)型
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á)式匹配其變體,從而處理不同情況(類(lèi)似 “多分支條件判斷”,但更安全)。
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ǔ)類(lèi)型為T(mén)的值
None, // 無(wú)值
}
Result<T, E>用于表示操作 “成功” 或 “失敗” 的結(jié)果,是 Rust 錯(cuò)誤處理的核心類(lèi)型。
enum Result<T, E> {
Ok(T), // 成功:存儲(chǔ)類(lèi)型為T(mén)的結(jié)果
Err(E), // 失?。捍鎯?chǔ)類(lèi)型為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整合Elasticsearch的詳細(xì)過(guò)程(收藏)
Elasticsearch是基于Lucene構(gòu)建的開(kāi)源分布式搜索和分析引擎,支持水平擴(kuò)展和多語(yǔ)言調(diào)用,ELK(Elastic Stack)組合包括Elasticsearch、Kibana、Logstash和Beats,專(zhuān)注于日志數(shù)據(jù)分析和實(shí)時(shí)監(jiān)控,本文介紹Rust整合Elasticsearch的過(guò)程,一起看看吧2024-11-11
詳解Rust調(diào)用tree-sitter支持自定義語(yǔ)言解析
使用Rust語(yǔ)言結(jié)合tree-sitter庫(kù)解析自定義語(yǔ)言需要定義語(yǔ)法、生成C解析器,并在Rust項(xiàng)目中集成,具體步驟包括創(chuàng)建grammar.js定義語(yǔ)法,使用tree-sitter-cli工具生成C解析器,以及在Rust項(xiàng)目中編寫(xiě)代碼調(diào)用解析器,這一過(guò)程涉及到對(duì)tree-sitter的深入理解和Rust語(yǔ)言的應(yīng)用技巧2024-09-09
Rust 所有權(quán)(Ownership)的使用小結(jié)
Rust通過(guò)所有權(quán)系統(tǒng)管理內(nèi)存,確保安全且無(wú)運(yùn)行時(shí)性能損失,所有權(quán)系統(tǒng)的核心規(guī)則包括唯一所有者、所有權(quán)失效時(shí)值自動(dòng)釋放和值在任何時(shí)刻只能有一個(gè)所有者,本教程詳細(xì)介紹了所有權(quán)的規(guī)則、棧與堆的區(qū)別以及所有權(quán)在變量賦值、函數(shù)傳參和返回值中的應(yīng)用2026-01-01
Rust聲明宏在不同K線bar類(lèi)型中的應(yīng)用小結(jié)
在K線bar中,往往有很多不同分時(shí)k線圖,比如1,2,3,5,,,,,60,120,250,300…,,不同分鐘類(lèi)型,如果不用宏,那么手寫(xiě)會(huì)比較麻煩,下面就試用一下宏來(lái)實(shí)現(xiàn)不同類(lèi)型的bar,感興趣的朋友一起看看吧2024-05-05
選擇Rust的理由:極致性能、內(nèi)存安全和確定性的資源管理
文章主要介紹了Rust編程語(yǔ)言在內(nèi)存管理、抽象層次、性能優(yōu)化和開(kāi)發(fā)體驗(yàn)等方面的優(yōu)勢(shì),將其與C/C++、Java等語(yǔ)言進(jìn)行對(duì)比,并通過(guò)具體示例展示了Rust在零成本抽象、所有權(quán)系統(tǒng)、零成本迭代、無(wú)態(tài)化等、零成本錯(cuò)誤處理和高效并發(fā)等特性,文章還分析了這些特性的實(shí)現(xiàn)原理和優(yōu)勢(shì)2026-05-05
rust多樣化錯(cuò)誤處理(從零學(xué)習(xí))
一個(gè)優(yōu)秀的項(xiàng)目,錯(cuò)誤處理的優(yōu)雅性是至關(guān)重要的,而rust,anyhow creat是繞不過(guò)去的一個(gè),今天我們來(lái)研究下,怎么使用它,幫助我們寫(xiě)出更優(yōu)雅的代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-11-11
Rust使用Trait對(duì)象實(shí)現(xiàn)多態(tài)的詳細(xì)步驟
本文詳細(xì)介紹了在Rust中使用Trait對(duì)象實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)的方法,通過(guò)一個(gè)圖形渲染系統(tǒng)的案例展示了如何統(tǒng)一管理不同類(lèi)型的圖形對(duì)象,文章涵蓋了Trait對(duì)象的核心概念、語(yǔ)法、性能考量以及在實(shí)際項(xiàng)目中的應(yīng)用場(chǎng)景,感興趣的朋友跟隨小編一起看看吧2025-11-11

