*和deref方法有什么区别?

时间:2020-06-21 23:33:33

标签: rust

例如,我有一个实现了Deref的结构

use std::ops::{Deref, DerefMut, IndexMut};

#[derive(Debug)]
struct Selector<T> {
    elements: Vec<T>,
    current: usize
}

impl<T> Deref for Selector<T> {
    type Target = T;
    fn deref(&self) -> &T {
        &self.elements[self.current]
    }
}

impl<T> DerefMut for Selector<T> {
    fn deref_mut(&mut self) -> &mut T {
        &mut self.elements[self.current]
    }
}

然后我做*s = 'w'; 这意味着锈蚀正在&s.elements[s.current] = 'w's.elements.index_mut(s.current) = 'w';相同 除了index_mut返回一个引用,并且您不能为某个对象分配引用,因此我将以上内容更改为*&mut *s.elements.index_mut(s.current) = 'w';

因此*s*s.deref_mut()相同,其中deref_mut是我对Deref的实现。因此,这使我认为*s更像**s,其中第一个*调用了我的deref_mut方法,第二个*将生成的&mut T转换为mut T。在我实现Deref之后,rust是否因为deref_mut返回引用而添加了另一个deref方法?如果是这样,这叫什么?

这是否意味着*和deref方法是不同的,其中一个跟随数据指针,而另一个允许您对引用执行某项操作然后返回另一个引用? rust是否隐式插入另一个*来转换引用?

1 个答案:

答案 0 :(得分:1)

如果x的类型为&T&mut T,则*x的类型为T

如果x具有其他类型的S怎么办?如果S实现了DerefDerefMut,则Rust将在.deref()上调用.deref_mut()x,然后取消引用。

这是否意味着*和deref方法不同,其中一个跟在指向数据的指针之后,而另一个则允许您对引用执行某项操作然后返回另一个引用?

是的。一元*运算符遵循引用,而deref特性将非引用强制为引用。

相关问题