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

解析Rust?struct?中的生命周期

 更新時間:2022年10月09日 08:36:55   作者:京東云開發(fā)者  
rust?的生命周期保證了內(nèi)存的安全性,同時也增加了開發(fā)者的心智負擔。是在上線之前多費心思寫代碼,還是在上線以后忙忙活活查問題,這是個?trade?off?問題,這篇文章主要介紹了Rust?struct?中的生命周期,需要的朋友可以參考下

最近在用rust 寫一個redis的數(shù)據(jù)校驗工具。redis-rs中具備 redis::ConnectionLike trait,借助它可以較好的來抽象校驗過程。在開發(fā)中,不免要定義struct 中的某些元素為 trait object,從而帶來一些rust語言中的生命周期問題。
本文不具體討論 redis的數(shù)據(jù)校驗過程,通過一個簡單的例子來聊聊 struct 中 trait object 元素的生命周期問題。

首先來定義一個 base trait,該 trait 中只包含一個函數(shù),返回String類型。

pub trait Base {
    fn say(&self) -> String;
}

接下來,定義兩個實現(xiàn)了 Base trait 的 struct AFromBase 和 BFromBase

pub struct AFromBase {
    content: String,
}

impl Base for AFromBase {
    fn say(&self) -> String {
        self.content.clone()
    }
}

pub struct BFromBase {
    text: String,
}

impl Base for BFromBase {
    fn say(&self) -> String {
        self.text.clone()
    }
}

接下來,定義一個struct 包含兩個 Base trait 的 trait object ,然后實現(xiàn)一個函數(shù)是 say 函數(shù)輸出的字符串的拼接結(jié)果.
按照其他沒有生命周期語言的編寫習慣,直覺上這么寫

pub struct AddTowBase {
    a: &mut dyn Base,
    b: &mut dyn Base,
}

impl AddTowBase {
    fn add(&self) -> String {
        let result = self.a.say() + &self.b.say();
        result
    }
}

最后,搞個main函數(shù)驗證一下。
完整代碼如下

pub trait Base {
    fn say(&self) -> String;
}

pub struct AFromBase {
    content: String,
}

impl Base for AFromBase {
    fn say(&self) -> String {
        self.content.clone()
    }
}

pub struct BFromBase {
    text: String,
}

impl Base for BFromBase {
    fn say(&self) -> String {
        self.text.clone()
    }
}

pub struct AddTowBase {
    a: &mut dyn Base,
    b: &mut dyn Base,
}

impl<'a> AddTowBase<'a> {
    fn add(&self) -> String {
        let result = self.a.say() + &self.b.say();
        result
    }
}

fn main() {
    let mut a = AFromBase {
        content: "baseA".to_string(),
    };

    let mut b = BFromBase {
        text: "baseB".to_string(),
    };

    let addtow = AddTowBase {
        a: &mut a,
        b: &mut b,
    };
    let r = addtow.add();
    println!("{}", r);
}

很遺憾,以上代碼是不能編譯通過的,編譯時報如下錯誤

error[E0106]: missing lifetime specifier
  --> examples/lifetimeinstruct.rs:26:8
   |
26 |     a: &mut dyn Base,
   |        ^ expected named lifetime parameter
   |
help: consider introducing a named lifetime parameter
   |
25 ~ pub struct AddTowBase<'a> {
26 ~     a: &'a mut dyn Base,
   |

error[E0106]: missing lifetime specifier
  --> examples/lifetimeinstruct.rs:27:8
   |
27 |     b: &mut dyn Base,
   |        ^ expected named lifetime parameter
   |
help: consider introducing a named lifetime parameter
   |
25 ~ pub struct AddTowBase<'a> {
26 |     a: &mut dyn Base,
27 ~     b: &'a mut dyn Base,
   |

For more information about this error, try `rustc --explain E0106`.
error: could not compile `wenpan-rust` due to 2 previous errors

編譯器給出的提示很明確,要在 trait object 上添加生命周期參數(shù),確保 struct 和他的 trait object 元素在同一生命周期,避免懸垂指針。
我們按照編譯器的提示修改代碼

pub struct AddTowBase<'a> {
    a: &'a mut dyn Base,
    b: &'a mut dyn Base,
}

impl<'a> AddTowBase<'a> {
    fn add(self) -> String {
        let result = self.a.say() + &self.b.say();
        result
    }
}

代碼順利通過編譯。
rust 的生命周期保證了內(nèi)存的安全性,同時也增加了開發(fā)者的心智負擔。是在上線之前多費心思寫代碼,還是在上線以后忙忙活活查問題,這是個 trade off 問題。俗話講:"背著抱著,一樣沉".我本人還是傾向于把問題控制在上線之前,少折騰用戶。

到此這篇關(guān)于Rust struct 中的生命周期的文章就介紹到這了,更多相關(guān)Rust struct生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解 Rust 中的模式匹配語法(最新推薦)

    深入理解 Rust 中的模式匹配語法(最新推薦)

    Rust中的模式匹配提供了多種方式來處理不同的數(shù)據(jù)類型和場景,本文給大家介紹Rust 中的模式匹配語法,感興趣的朋友一起看看吧
    2025-03-03
  • Rust中實例化動態(tài)對象的示例詳解

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

    這篇文章主要為大家詳細介紹了Rust中實例化動態(tài)對象的多種方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-02-02
  • Rust語言之結(jié)構(gòu)體和枚舉的用途與高級功能詳解

    Rust語言之結(jié)構(gòu)體和枚舉的用途與高級功能詳解

    Rust 是一門注重安全性和性能的現(xiàn)代編程語言,其中結(jié)構(gòu)體和枚舉是其強大的數(shù)據(jù)類型之一,了解結(jié)構(gòu)體和枚舉的概念及其高級功能,將使你能夠更加靈活和高效地處理數(shù)據(jù),本文將深入探討 Rust 中的結(jié)構(gòu)體和枚舉,并介紹它們的用途和高級功能
    2023-10-10
  • Rust中的Vector多值存儲使用方法

    Rust中的Vector多值存儲使用方法

    Vector在Rust中是一個非常靈活和強大的數(shù)據(jù)結(jié)構(gòu),通過有效利用它,我們可以更加方便地處理和操作多個值,使得代碼更加清晰和易于維護,這篇文章主要介紹了Rust中的Vector多值存儲的利器,需要的朋友可以參考下
    2024-02-02
  • rust標準庫std::env環(huán)境相關(guān)的常量

    rust標準庫std::env環(huán)境相關(guān)的常量

    在本章節(jié)中, 我們探討了Rust處理命令行參數(shù)的常見的兩種方式和處理環(huán)境變量的兩種常見方式, 拋開Rust的語法, 實際上在命令行參數(shù)的處理方式上, 與其它語言大同小異, 可能影響我們習慣的也就只剩下語法,本文介紹rust標準庫std::env的相關(guān)知識,感興趣的朋友一起看看吧
    2024-03-03
  • Rust編寫自動化測試實例權(quán)威指南

    Rust編寫自動化測試實例權(quán)威指南

    這篇文章主要為大家介紹了Rust編寫自動化測試實例權(quán)威指南詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 如何基于Rust實現(xiàn)文本搜索minigrep

    如何基于Rust實現(xiàn)文本搜索minigrep

    這篇文章主要介紹了基于Rust實現(xiàn)的文本搜索minigrep,本次演示介紹針對原作者代碼程序的查詢邏輯做了一點點小的優(yōu)化,原程序邏輯的查詢是放在了程序運行的時候,邏輯修改后啟動的時候可以添加參數(shù),也可以啟動后添加,需要的朋友可以參考下
    2024-08-08
  • Rust的泛型、Traits與生命周期用法及說明

    Rust的泛型、Traits與生命周期用法及說明

    本文通過一個尋找列表中最大值的示例,展示了如何從重復代碼中提取函數(shù),再利用泛型實現(xiàn)代碼復用,主要步驟包括:識別重復邏輯;抽象提??;泛型應用;進一步擴展,通過不斷抽象和泛化,我們不僅能減少代碼重復,還能寫出更通用、健壯和可維護的代碼
    2025-02-02
  • rust聲明式宏的實現(xiàn)

    rust聲明式宏的實現(xiàn)

    聲明式宏使得你能夠?qū)懗鲱愃?match?表達式的東西,來操作你所提供的?Rust代碼,它使用你提供的代碼來生成用于替換宏調(diào)用的代碼,感興趣的可以了解一下
    2023-12-12
  • 關(guān)于Rust編譯時報link.exe?not?found錯誤問題

    關(guān)于Rust編譯時報link.exe?not?found錯誤問題

    這篇文章主要介紹了Rust編譯的時候報出link.exe?not?found錯誤問題,解決方法是在命令行就是CMD執(zhí)行相應的命令即可,本文給大家分解決方法,需要的朋友可以參考下
    2022-09-09

最新評論

铅山县| 台北市| 库车县| 曲沃县| 龙胜| 德令哈市| 阿拉善左旗| 大关县| 芜湖县| 江北区| 荥经县| 英德市| 白河县| 马山县| 库伦旗| 吉水县| 涟源市| 安龙县| 安龙县| 同德县| 平利县| 无锡市| 奉节县| 于田县| 许昌县| 阿拉善右旗| 宣汉县| 科尔| 安义县| 田东县| 南华县| 如东县| 专栏| 朔州市| 南京市| 中牟县| 德昌县| 五原县| 莆田市| 宁武县| 崇阳县|