Rust - Deref Trait

Rust - Deref Trait 首页 / Rust入门教程 / Rust - Deref Trait
  • Deref <T>特征用于自定义解除引用运算符(*)的行为。
  • 如果我们实现Deref <T>特征,则可以将智能指针视为引用。因此,在引用上起作用的代码也可以在智能指针上使用。

常规引用

常规引用是一种指向存储在其他位置的值的指针。让我们看一个简单的示例,创建i32类型值的引用,然后对这个引用使用解引用运算符。

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

输出:

a and *b are equal

在上面的示例中,a保持i32类型值,而20则包含对'a'变量的引用。如果使用* b,则它表示值20。因此,我们可以比较变量a和* b,它将返回真实值。如果我们使用&b而不是* b,则编译器将引发错误“cannot compare {integer} with {&integer}”。

Box <T>引用

Box <T>指针可用作引用。让我们看看一个简单的例子:

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

输出:

Value of *b is 11

在上面的示例中,Box <T>的行为与常规引用相似。它们之间的唯一区别是b包含指向数据的框,而不是通过使用'&'运算符引用该值的框。

智能指针引用

现在,我们创建类似于Box <T>类型的智能指针,我们将看到它们与常规引用的行为有所不同。

  • 可以将Box <T>定义为具有一个元素的元组结构,例如MyBox <T>。
  • 创建元组结构后,我们在MyBox <T>类型上定义函数。

让我们看看一个简单的例子:

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 Deref

在上面的示例中,我们创建了智能指针b,但是无法对其取消引用。因此,我们得出结论,不能取消引用与Box <T>类型相似的自定义指针。

Deref Trait

  • Deref特征在标准库中定义,该标准库用于实现名为deref的方法。
  • deref方法借用自身并返回对内部数据的引用。

让我们看看一个简单的例子:

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

输出:

10

Deref Coercion

  • Deref Coercion是将实现Deref特征的引用转换为Deref可以将原始类型转换为该引用的过程。
  • Deref Coercion是对函数和方法的参数执行的。
  • 当我们将特定类型的引用传递给与函数定义中的参数类型不匹配的函数时,Deref Coercion会自动发生。

让我们看看一个简单的例子:

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

输出:

5

在上面的示例中,我们使用参数&b调用print(&b)函数,该参数是&Box <i32>的引用。在这种情况下,我们实现了Deref特性,该特性通过Deref Coercion的过程将&Box <i32>转换为&i32。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

AI技术内参 -〔洪亮劼〕

ZooKeeper实战与源码剖析 -〔么敬国〕

To B市场品牌实战课 -〔曹林〕

Spark核心原理与实战 -〔王磊〕

恋爱必修课 -〔李一帆〕

Spark性能调优实战 -〔吴磊〕

Redis源码剖析与实战 -〔蒋德钧〕

快手 · 音视频技术入门课 -〔刘歧〕

结构写作力 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)