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

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

 更新時(shí)間: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,
}

在定義了這個(gè)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這個(gè)crate為例

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

// 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的類型是一個(gè)enum,

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

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

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

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

這看起來滿足Rust中的匹配必須是窮舉式的(exhaustive)這一要求。因此似乎第2個(gè)模式Ok(_) => ,就顯得多余了。但若去掉這行,編譯時(shí)就會報(bào)錯(cuò)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`.

這背后的原因就是因?yàn)?code>enum Channel是non_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>),
}

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

感覺這應(yīng)該算Rust確保程序健壯性(魯棒性)的一方面,在編譯階段就報(bào)出潛在的錯(cuò)誤——咱也不知道引用的crate什么時(shí)候會在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ù)類型、浮點(diǎn)類型、布爾類型以及字符類型,具有一定的參考價(jià)值,感興趣的可以了解一下
    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)用方式,本文將通過一個(gè)簡單的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í)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-05-05
  • Rust中實(shí)例化動態(tài)對象的示例詳解

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

    這篇文章主要為大家詳細(xì)介紹了Rust中實(shí)例化動態(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中錯(cuò)誤處理與響應(yīng)構(gòu)建

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

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

    詳解Rust中的方法

    方法其實(shí)就是結(jié)構(gòu)體的成員函數(shù),在C語言中的結(jié)構(gòu)體是沒有成員函數(shù)的,但是Rust畢竟也是一門面向?qū)ο蟮木幊陶Z言,所以給結(jié)構(gòu)體加上方法的特性很符合面向?qū)ο蟮奶攸c(diǎn),這篇文章主要介紹了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í)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05

最新評論

滦南县| 万山特区| 波密县| 开化县| 盐亭县| 连州市| 靖江市| 靖远县| 阿坝县| 石柱| 南阳市| 吴堡县| 巴林左旗| 鲁甸县| 克拉玛依市| 庆元县| 云阳县| 湄潭县| 合江县| 隆回县| 社旗县| 淄博市| 靖安县| 北票市| 行唐县| 阳泉市| 墨江| 海淀区| 菏泽市| 新营市| 贵港市| 荣成市| 沂源县| 波密县| 奉化市| 泗水县| 安顺市| 大港区| 阜南县| 贵定县| 阿克|