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

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

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

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

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

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

接下來(lái),定義兩個(gè)實(shí)現(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()
    }
}

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

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
    }
}

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

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);
}

很遺憾,以上代碼是不能編譯通過(guò)的,編譯時(shí)報(bào)如下錯(cuò)誤

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
    }
}

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

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

相關(guān)文章

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

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

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

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

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

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

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

    Rust中的Vector多值存儲(chǔ)使用方法

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

    rust標(biāo)準(zhǔn)庫(kù)std::env環(huán)境相關(guān)的常量

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

    Rust編寫(xiě)自動(dòng)化測(cè)試實(shí)例權(quán)威指南

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

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

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

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

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

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

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

    關(guān)于Rust編譯時(shí)報(bào)link.exe?not?found錯(cuò)誤問(wèn)題

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

最新評(píng)論

肥东县| 邮箱| 石屏县| 昌邑市| 长海县| 托克托县| 丽江市| 凤台县| 徐州市| 新邵县| 澄迈县| 迭部县| 江津市| 勐海县| 集安市| 舟曲县| 海口市| 信丰县| 栖霞市| 临沭县| 郑州市| 广德县| 沈阳市| 文昌市| 高陵县| 渭源县| 富宁县| 新化县| 衡东县| 伊吾县| 濉溪县| 佛坪县| 长宁区| 淳化县| 鄯善县| 神池县| 德阳市| 安化县| 唐山市| 商洛市| 阿拉善左旗|