欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2024年01月23日 10:30:18   作者:繁星遙可及  
這篇文章主要介紹了Rust 智能指針的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

Rust 第24節(jié) 智能指針

智能指針的實(shí)現(xiàn)

智能指針通常使用struct實(shí)現(xiàn),
并實(shí)現(xiàn)Deref和Drop這兩個trait

Deref trait:允許智能指針struct 的實(shí)例像引用一樣使用

Drop triat: 允許你自定義當(dāng)智能指針實(shí)例走出作用域時的代碼

標(biāo)準(zhǔn)庫中常見的智能指針

Box<T>:在heap內(nèi)存上分配值
Rc<T>: 啟用多重所有權(quán)的引用技術(shù)類型
Ref<T>     RefMut<T>     通過RefCall<T> 訪問:在運(yùn)行時而不是編譯時強(qiáng)制借用規(guī)則的類型

使用Box 來指向Heap上的數(shù)據(jù)

他是最簡單的智能指針

    let b = Box::new(5);
    println!("b = {}",b);

rust 編譯時需要知道一個類型所占的空間大小

但是遞歸類型的大小在編譯時無法確認(rèn)大小

使用Box可以解決,Box是指針,大小確認(rèn)

Deref Trait

Deref 解引用,我們可以自定義解引用運(yùn)算符*的行為

通過Deref,智能指針可以像常規(guī)引用一樣來處理

解引用運(yùn)算符

    let x = 5;
    let y = &x;
    assert_eq!(5,x);
    assert_eq!(5,*y);

使用box

    let y = Box::new(5);
    assert_eq!(5,*y);

自定義一個元組指針

struct Mypointer<T>(T); //結(jié)構(gòu)體元組,只有一個成員
//元組結(jié)構(gòu)體相當(dāng)于沒有成員名字的結(jié)構(gòu)體,通過索引訪問
impl<T> Mypointer<T> {
    fn new(x : T) -> Mypointer<T> {
        Mypointer(x)
    }
}
//要讓其成為指針,需要實(shí)現(xiàn)Deref方法
impl<T> Deref for Mypointer<T> {
    type Target = T;
    fn deref(&self) -> &T {
        &self.0
    }
}
    let y = Mypointer::new(5);
    assert_eq!(5,*y);

Deref 隱式解引用方法

當(dāng)傳入類型與函數(shù)接收類型不匹配時,如果參數(shù)實(shí)現(xiàn)了Deref trait,則編譯器會自動調(diào)用Deref方法,對參數(shù)類型進(jìn)行匹配;

例子:

fn hello(name :  & str) {
    println!("hello,{}",name);
}
    hello("Rust");
    let m = Mypointer::new(String::from("Rust"));
        //原始類型為 &mypointer<String>
        // deref &string
        // deref &str
    hello(&m);

Drop Trait

實(shí)現(xiàn)后,可以自定義值離開作用域時發(fā)生的動作

要求實(shí)現(xiàn)drop方法

在變量離開作用域時,會自動調(diào)用drop方法

例子:

impl<T> Drop for Mypointer<T> {
    fn drop(&mut self) {
        println!("run drop function----")
    }
}

不能手動調(diào)用.drop()方法

但是可以調(diào)用drop(變量)函數(shù) 進(jìn)行手動注銷

Rc引用計數(shù)智能指針

有時,一個值會有多個所有者

為了支持多重所有權(quán),引入 Rc

Rc只能用于單線程場景

方法:

Rc::clone(&a)函數(shù):增加引用計數(shù)

Rc::strong_count(&a): 獲得引用計數(shù)

例子:

enum Node2 {
    Next2(i32 ,Rc<Node2> ),
    Nul
}
use self::Node2::Next2;
use self::Node2::Nul;
.... main.....
    let a = Rc::new( Next2(5, Rc::new( Nul ) ));
    println!("a value is {}",Rc::strong_count(&a));
    let b = Rc::new( Next2(
        12, Rc::clone(&a)
        )
    );
    println!("after b :a value is {}",Rc::strong_count(&a));
    let c = Rc::new(
        Next2(  11, Rc::clone(&a)  )
    );
    println!("after c: a value is {}",Rc::strong_count(&a));
    {
        let d = Rc::new(
            Next2(  15, Rc::clone(&a)  )
        );
        println!("after d :a value is {}",Rc::strong_count(&a));
    }
    println!("end : a value is {}",Rc::strong_count(&a));
....end....

通過不可變的引用,使你可以在程序不同部分之間共享只讀數(shù)據(jù)

與clone()相比,屬于淺拷貝,執(zhí)行速度快

RefCell 和內(nèi)部可變性

內(nèi)部可變性:

允許在只持有不可變引用的前提下對數(shù)據(jù)進(jìn)行修改

RefCell 在運(yùn)行時檢查所有權(quán)規(guī)則

只能用于單線程的代碼

BoxRcRefCell
同一數(shù)據(jù)所有者一個多個一個
可變性、借用檢查可變、不可變借用(編譯時檢查)不可變借用(編譯時檢查)可變、不可變借用(運(yùn)行時檢查)

正常情況下無法借用一個不可變的可變借用

let a = 10;
let b = &mut a;//錯誤

Refcall 的 .borrow_mut()方法:修改不可變引用的值

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

相關(guān)文章

  • rust中的match表達(dá)式使用詳解

    rust中的match表達(dá)式使用詳解

    在rust中提供了一個極為強(qiáng)大的控制流運(yùn)算符match,這篇文章主要介紹了rust中的match表達(dá)式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 詳解Rust 生命周期符號使用的方法和規(guī)律

    詳解Rust 生命周期符號使用的方法和規(guī)律

    生命周期是 Rust 中處理引用和所有權(quán)的關(guān)鍵概念,通過正確使用生命周期符號和遵循相關(guān)規(guī)律,你可以編寫出安全、高效的 Rust 代碼,這篇文章主要介紹了Rust 生命周期符號使用的方法和規(guī)律,需要的朋友可以參考下
    2024-03-03
  • Rust實(shí)現(xiàn)AES加解密詳解

    Rust實(shí)現(xiàn)AES加解密詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Rust語言實(shí)現(xiàn)AES加解密算法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以了解一下
    2022-10-10
  • Rust 數(shù)據(jù)類型詳解

    Rust 數(shù)據(jù)類型詳解

    本文介紹了Rust編程語言中的標(biāo)量類型和復(fù)合類型,標(biāo)量類型包括整數(shù)、浮點(diǎn)數(shù)、布爾和字符,而復(fù)合類型則包括元組和數(shù)組,標(biāo)量類型用于表示單個值,具有不同的表示和范圍,本文介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-01-01
  • 在Rust?web服務(wù)中使用Redis的方法

    在Rust?web服務(wù)中使用Redis的方法

    這篇文章主要介紹了在Rust?web服務(wù)中使用Redis,在這篇文章中,我們將演示如何在一個Rust?web應(yīng)用程序中使用Redis,需要的朋友可以參考下
    2022-08-08
  • Rust動態(tài)調(diào)用字符串定義的Rhai函數(shù)方式

    Rust動態(tài)調(diào)用字符串定義的Rhai函數(shù)方式

    Rust中使用Rhai動態(tài)調(diào)用字符串定義的函數(shù),通過eval_expression_with_scope實(shí)現(xiàn),但參數(shù)傳遞和函數(shù)名處理有局限性,使用FnCall功能更健壯,但更復(fù)雜,總結(jié)提供了更通用的方法,但需要處理更多錯誤情況
    2025-02-02
  • rust聲明式宏的實(shí)現(xiàn)

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

    聲明式宏使得你能夠?qū)懗鲱愃?match?表達(dá)式的東西,來操作你所提供的?Rust代碼,它使用你提供的代碼來生成用于替換宏調(diào)用的代碼,感興趣的可以了解一下
    2023-12-12
  • rust引用和借用的使用小結(jié)

    rust引用和借用的使用小結(jié)

    在rust中,引用的語法非常簡單。通過&來取引用,通過*來解引用,這篇文章主要介紹了rust引用和借用的使用小結(jié),總的來說,借用規(guī)則,同一時刻,你只能擁有要么一個可變引用,?要么任意多個不可變引用,具體內(nèi)容詳情跟隨小編一起看看吧
    2023-01-01
  • rust的vector和hashmap詳解

    rust的vector和hashmap詳解

    這篇文章主要介紹了rust的vector和hashmap,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Rust中Cargo的使用詳解

    Rust中Cargo的使用詳解

    Cargo 是 Rust 的構(gòu)建系統(tǒng)和包管理器,?多數(shù) Rustacean 們使? Cargo 來管理他們的 Rust 項(xiàng)?,因?yàn)樗梢詾槟闾幚砗芏嗳蝿?wù),?如構(gòu)建代碼、下載依賴庫并編譯這些庫,這篇文章主要介紹了Rust中Cargo的使用,需要的朋友可以參考下
    2022-11-11

最新評論