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

Rust中non_exhaustive的enum使用確保程序健壯性

 更新時間:2023年11月03日 10:29:17   作者:da_miao_zi  
這篇文章主要為大家介紹了Rust中non_exhaustive的enum使用確保程序健壯性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Rust中non_exhaustive的enum

所謂non_exhaustive的enum就是定義中帶有#[non_exhaustive]enum,如

#[non_exhaustive]
pub enum Error {
    Message(String),
    Other,
}

在定義了這個enum的crate中,non_exhaustive沒有任何效果。

let error = Error::Other;
// Non-exhaustive enums can be matched on exhaustively within the defining crate.
match error {
    Error::Message(ref s) => { },
    Error::Other => { },
}

但若引用的crate中存在non_exhaustiveenum,會發(fā)生什么呢?

以libpnet這個crate為例

https://docs.rs/pnet/latest/pnet/#這個頁面給出的示例代碼中,可以看到這么一段

// Create a new channel, dealing with layer 2 packets
let (mut tx, mut rx) = match datalink::channel(&interface, Default::default()) {
    Ok(Ethernet(tx, rx)) => (tx, rx),
    Ok(_) => panic!("Unhandled channel type"),
    Err(e) => panic!("An error occurred when creating the datalink channel: {}", e)
};

datalink::channel()的返回值類型為Result<Channel, Error>,而Channel的類型是一個enum,

pub enum Channel {
    Ethernet(Box<dyn DataLinkSender, Global>, Box<dyn DataLinkReceiver, Global>),
}

atalink::channel()返回結(jié)果分析

如果datalink::channel()返回的是成功的結(jié)果(類型為Channel),將與第一個Ok(Ethernet(tx, rx))模式的前半部分匹配(因為Ok()就對應(yīng)成功的結(jié)果)。

而根據(jù)Channel的定義,Channel::Ethernet(tx, rx)是該enum唯一的成員(variant),所以只要是成功的結(jié)果,就應(yīng)該匹配第1個模式,否則就匹配最后的Err(e)這個模式。

這看起來滿足Rust中的匹配必須是窮舉式的(exhaustive)這一要求。因此似乎第2個模式Ok(_) => ,就顯得多余了。但若去掉這行,編譯時就會報錯Ok(_) not covered

error[E0004]: non-exhaustive patterns: `Ok(_)` not covered
  --> src/main.rs:33:31
   |
33 |     let (_tx, mut rx) = match datalink::channel(&interface, Default::default()) {
   |                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pattern `Ok(_)` not covered
   |
note: `Result<Channel, std::io::Error>` defined here
...
   |
   = note: not covered
   = note: the matched value is of type `Result<Channel, std::io::Error>`
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
   |
38 ~         },
39 +         Ok(_) => todo!()
   |

For more information about this error, try `rustc --explain E0004`.

這背后的原因就是因為enum Channelnon_exhaustive的,其完整定義是

// https://docs.rs/pnet_datalink/0.34.0/src/pnet_datalink/lib.rs.html#99
/// A channel for sending and receiving at the data link layer.
#[non_exhaustive]
pub enum Channel {
    /// A datalink channel which sends and receives Ethernet packets.
    Ethernet(Box<dyn DataLinkSender>, Box<dyn DataLinkReceiver>),
}

而我們又在外部引用了包含這個enum的crate。解決的辦法就是加入Ok(_) => {...}。

感覺這應(yīng)該算Rust確保程序健壯性(魯棒性)的一方面,在編譯階段就報出潛在的錯誤——咱也不知道引用的crate什么時候會在enum中增加新的成員。

參考

https://doc.rust-lang.org/beta/reference/attributes/type_syst... Type system attributes

https://docs.rs/pnet/latest/pnet/#examples This (fairly useless) code implements an Ethernet echo server.

以上就是Rust中non_exhaustive的enum使用確保程序健壯性的詳細(xì)內(nèi)容,更多關(guān)于Rust 的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Rust標(biāo)量類型的具體使用

    Rust標(biāo)量類型的具體使用

    本文主要介紹了Rust標(biāo)量類型的具體使用,其中包括整數(shù)類型、浮點類型、布爾類型以及字符類型,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 深入探究在Rust中函數(shù)、方法和關(guān)聯(lián)函數(shù)有什么區(qū)別

    深入探究在Rust中函數(shù)、方法和關(guān)聯(lián)函數(shù)有什么區(qū)別

    在 Rust 中,函數(shù)、方法和關(guān)聯(lián)函數(shù)都是用來封裝行為的,它們之間的區(qū)別主要在于它們的定義和調(diào)用方式,本文將通過一個簡單的rust代碼示例來給大家講講Rust中函數(shù)、方法和關(guān)聯(lián)函數(shù)區(qū)別,需要的朋友可以參考下
    2023-08-08
  • Rust語言從入門到精通系列之Iterator迭代器深入詳解

    Rust語言從入門到精通系列之Iterator迭代器深入詳解

    這篇文章主要為大家介紹了Rust語言從入門到精通系列之Iterator迭代器深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Rust內(nèi)存示例深入講解

    Rust內(nèi)存示例深入講解

    內(nèi)存管理一直是編程中的一大挑戰(zhàn),尤其是在C和C++中,程序員需要手動處理內(nèi)存分配和釋放,這篇文章主要介紹了Rust內(nèi)存的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-02-02
  • rust 中的 EBNF簡介舉例

    rust 中的 EBNF簡介舉例

    這篇文章主要介紹了rust 中的 EBNF簡介舉例,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-05-05
  • Rust中實例化動態(tài)對象的示例詳解

    Rust中實例化動態(tài)對象的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Rust中實例化動態(tài)對象的多種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Rust?編程語言中的所有權(quán)ownership詳解

    Rust?編程語言中的所有權(quán)ownership詳解

    這篇文章主要介紹了Rust?編程語言中的所有權(quán)ownership詳解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 淺談Rust中錯誤處理與響應(yīng)構(gòu)建

    淺談Rust中錯誤處理與響應(yīng)構(gòu)建

    Rust通過Result和Option類型以及?操作符提供強大的錯誤處理機制,強制開發(fā)者顯式處理錯誤,下面就來介紹一下,感興趣的可以了解一下
    2026-01-01
  • 詳解Rust中的方法

    詳解Rust中的方法

    方法其實就是結(jié)構(gòu)體的成員函數(shù),在C語言中的結(jié)構(gòu)體是沒有成員函數(shù)的,但是Rust畢竟也是一門面向?qū)ο蟮木幊陶Z言,所以給結(jié)構(gòu)體加上方法的特性很符合面向?qū)ο蟮奶攸c,這篇文章主要介紹了Rust中的方法,需要的朋友可以參考下
    2022-10-10
  • Rust操作Redis從入門到生產(chǎn)級應(yīng)用

    Rust操作Redis從入門到生產(chǎn)級應(yīng)用

    本文將基于主流的redis-rs庫,帶你全面掌握Rust操作Redis的技巧,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05

最新評論

临漳县| 山东省| 揭阳市| 通化县| 孝昌县| 唐河县| 余姚市| 山阳县| 门源| 马山县| 孙吴县| 元阳县| 基隆市| 仙桃市| 家居| 璧山县| 大名县| 中方县| 莎车县| 清苑县| 禄劝| 浦江县| 白朗县| 罗定市| 射阳县| 万安县| 东明县| 闻喜县| 托里县| 兴安县| 遂川县| 阜新市| 武定县| 扬中市| 丹东市| 若羌县| 塘沽区| 南皮县| 阿合奇县| 凤山县| 怀仁县|