例如,我有一个实现了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是否隐式插入另一个*
来转换引用?
答案 0 :(得分:1)
如果x
的类型为&T
或&mut T
,则*x
的类型为T
。
如果x
具有其他类型的S
怎么办?如果S
实现了Deref
或DerefMut
,则Rust将在.deref()
上调用.deref_mut()
或x
,然后取消引用。
这是否意味着*和deref方法不同,其中一个跟在指向数据的指针之后,而另一个则允许您对引用执行某项操作然后返回另一个引用?
是的。一元*
运算符遵循引用,而deref特性将非引用强制为引用。