午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Rust Deref trait

 lichwoo 2021-07-10

Deref <T> trait用于自定義解除引用運(yùn)算符(*)的行為。
如果實(shí)現(xiàn)Deref <T>特征,則可以將智能指針視為參考。 因此,在引用上工作的代碼也可以用在智能指針上。

常規(guī)引用

常規(guī)引用是一種指向某個(gè)值的指針,該值存儲(chǔ)在其他地方。下面來(lái)看一個(gè)簡(jiǎn)單的例子來(lái)創(chuàng)建i32類(lèi)型值的引用,然后使用引用運(yùn)算符和this引用。

fn main()  
{  
  let a = 20;  
  let b = &a;  
  if a==*b  
  {  
    println!("a and *b are equal");  
  }  

  else  
  {  
    println!("they are not equal");  
  }  
}Rust

執(zhí)行上面示例代碼,得到以下結(jié)果 -

a and *b are equalShell

在上面的例子中,a保存i32類(lèi)型值20,而b包含a變量的引用。 如果使用* b,那么它代表值20。因此,可以比較變量a* b,它將返回真值。 如果使用&b而不是* b,則編譯器會(huì)拋出錯(cuò)誤“無(wú)法將{integer}與{&integer}進(jìn)行比較”。

Box <T>作為引用

Box <T>指針可用作引用。

下面來(lái)看一個(gè)簡(jiǎn)單的例子:

fn main()  
{  
  let a = 11;  
  let b = Box::new(a);  
  print!("Value of *b is {}",*b);  
}Rust

輸出結(jié)果如下所示 -

Value of *b is 11Shell

在上面的示例中,Box <T>的行為與常規(guī)引用類(lèi)似。 它們之間的唯一區(qū)別是b包含指向數(shù)據(jù)的框,而不是通過(guò)使用&運(yùn)算符引用該值。

智能指針作為引用

現(xiàn)在,創(chuàng)建類(lèi)似于Box <T>類(lèi)型的智能指針,它們的行為與常規(guī)引用有一些不同。

Box <T>可以定義為具有一個(gè)元素的元組結(jié)構(gòu),例如MyBox <T>
創(chuàng)建元組結(jié)構(gòu)后,在MyBox <T>類(lèi)型上定義函數(shù)。

下面來(lái)看一個(gè)簡(jiǎn)單的例子:

struct MyBox<T>(T);  
impl<T> MyBox<T>  
{  
  fn example(y : T)->MyBox<T>  
  {  
    MyBox(y)  
  }  
}  
fn main()  
{  
  let a = 8;  
  let b = MyBox::example(a);  
  print!("Value of *b is {}",*b);  
}Rust

執(zhí)行上面示例代碼,得到以下結(jié)果 -

在上面的例子中,創(chuàng)建了智能指針b,但它不能被解除引用。 因此得出結(jié)論,無(wú)法取消類(lèi)似于Box <T>類(lèi)型的自定義指針的引用。

實(shí)現(xiàn)Deref Trait

  • Deref Trait在標(biāo)準(zhǔn)庫(kù)中定義,該庫(kù)用于實(shí)現(xiàn)名為deref的方法。

  • deref方法借用self并返回對(duì)內(nèi)部數(shù)據(jù)的引用。

下面來(lái)看一個(gè)簡(jiǎn)單的例子:

struct MyBox<T>  
{  
  a : T,  
}  
use :: std::ops::Deref;  
impl<T> Deref for MyBox<T>  
{  
  type Target = T;  
  fn deref(&self) ->&T  
  {  
    &self.a  
  }  
}  
fn main()  
{  
  let b = MyBox{a : 10};  
  print!("{}",*(b.deref()));  
}Rust

執(zhí)行上面示例代碼,得到以下結(jié)果 -

10Shell

程序說(shuō)明

  • Deref traitMyBox類(lèi)型上實(shí)現(xiàn)。

  • Deref trait實(shí)現(xiàn)deref()方法,deref()方法返回a變量的引用。

  • type Target = T;Deref trait的關(guān)聯(lián)類(lèi)型。關(guān)聯(lián)類(lèi)型用于聲明泛型類(lèi)型參數(shù)。

  • 創(chuàng)建了MyBox類(lèi)型的實(shí)例 - b 。

  • 通過(guò)使用MyBox類(lèi)型的實(shí)例b.deref()調(diào)用deref()方法,然后取消引用從deref()方法返回的引用。

Deref強(qiáng)制

  • Deref強(qiáng)制是將實(shí)現(xiàn)Deref trait的引用轉(zhuǎn)換為Deref可以將原始類(lèi)型轉(zhuǎn)換為的引用的過(guò)程。

  • Deref強(qiáng)制是對(duì)函數(shù)和方法的參數(shù)執(zhí)行的。

  • 當(dāng)將特定類(lèi)型的引用傳遞給與函數(shù)定義中的參數(shù)類(lèi)型不匹配的函數(shù)時(shí),Deref強(qiáng)制自動(dòng)發(fā)生。

下面來(lái)看一個(gè)簡(jiǎn)單的例子:

struct MyBox<T>(T);  
use :: std::ops::Deref;  
impl<T> MyBox<T>  
{  
  fn hello(x:T)->MyBox<T>  
  {  
    MyBox(x)  
  }  
}  
impl<T> Deref for MyBox<T>  
{  
  type Target = T;  
  fn deref(&self) ->&T  
  {  
    &self.0  
  }  
}  
fn print(m : &i32)  
{  
  print!("{}",m);  
}  
fn main()  
{  
  let b = MyBox::hello(5);  

  print(&b);  
}Rust

執(zhí)行上面示例代碼,得到以下結(jié)果 -

5

在上面的例子中,使用參數(shù)&b調(diào)用print(&b)函數(shù),它是&Box <i32>的引用。 在這種情況下,實(shí)現(xiàn)Deref trait,通過(guò)Deref強(qiáng)制過(guò)程將&Box <i32>轉(zhuǎn)換為&i32

Derif強(qiáng)制與可變性的相互作用

到目前為止,使用Deref Trait覆蓋不可變引用上的*運(yùn)算符,可以使用DerefMut Trait覆蓋可變引用上的*運(yùn)算符。

Rust在以下三種情況下執(zhí)行Deref強(qiáng)制:

  • 當(dāng)T:Deref <Target = U>其中TU是不可變引用時(shí),則&T轉(zhuǎn)換為&U類(lèi)型。

  • 當(dāng)T:DerefMut <Target = U>,其中TU是可變引用時(shí),則&mut T被轉(zhuǎn)換為&mut U。

  • 當(dāng)T:Deref <Target = U>,其中T是可變引用而U是不可變引用,則&mut T被轉(zhuǎn)換為&U。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多