最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust中的Enum與Struct示例詳解

 更新時(shí)間:2025年10月27日 09:37:41   作者:alwaysrun  
在 Rust 中,struct(結(jié)構(gòu)體)和enum(枚舉)是兩種核心的自定義類(lèi)型,分別用于組合相關(guān)數(shù)據(jù)和表示互斥的可能性,這篇文章主要介紹了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 TraitBox<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中的Option枚舉快速入門(mén)教程

    Rust中的Option枚舉快速入門(mén)教程

    Rust中的Option枚舉用于表示可能不存在的值,提供了多種方法來(lái)處理這些值,避免了空指針異常,文章介紹了Option的定義、常見(jiàn)方法、使用場(chǎng)景以及注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Rust整合Elasticsearch的詳細(xì)過(guò)程(收藏)

    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 智能指針實(shí)現(xiàn)方法

    Rust 智能指針實(shí)現(xiàn)方法

    這篇文章主要介紹了Rust 智能指針的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • 深入理解Rust中的 Send 和 Sync trait

    深入理解Rust中的 Send 和 Sync trait

    Rust中的標(biāo)記 trait(Marker Trait)Send和Sync是并發(fā)安全的核心基石,這篇文章給大家介紹Rust中的Send和Sync trait,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • 詳解Rust調(diào)用tree-sitter支持自定義語(yǔ)言解析

    詳解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 所有權(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é)

    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的理由:極致性能、內(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í))

    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ì)步驟

    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

最新評(píng)論

柳河县| 息烽县| 栾川县| 宁津县| 阜新市| 新化县| 淄博市| 吉木萨尔县| 梅州市| 东源县| 鸡泽县| 永城市| 屏东县| 绥化市| 吴川市| 景东| 清远市| 古交市| 巴东县| 比如县| 汶川县| 黔西| 渝中区| 新泰市| 桂林市| 定结县| 拜泉县| 团风县| 凤凰县| 安丘市| 麦盖提县| 获嘉县| 涟源市| 喜德县| 和硕县| 麦盖提县| 紫金县| 新宁县| 威信县| 台山市| 蓬安县|