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下面來(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 trait 在MyBox 類(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> 其中T 和U 是不可變引用時(shí),則&T 轉(zhuǎn)換為&U 類(lèi)型。 當(dāng)T:DerefMut <Target = U> ,其中T 和U 是可變引用時(shí),則&mut T 被轉(zhuǎn)換為&mut U 。 當(dāng)T:Deref <Target = U> ,其中T 是可變引用而U 是不可變引用,則&mut T 被轉(zhuǎn)換為&U 。
|