【发布时间】:2020-06-21 23:33:33
【问题描述】:
例如,我有一个实现了 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';
这意味着 rust 正在做&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。 rust 在我实现 Deref 之后是否添加了另一个 deref 方法,因为 deref_mut 返回一个引用?如果有,这叫什么?
这是否意味着* 和 deref 方法不同,其中一个跟随指向数据的指针,另一个允许您对引用执行某些操作,然后返回另一个引用? rust 是否隐式插入另一个* 来转换引用?
【问题讨论】:
-
为什么你的代码直接调用
index_mut?&mut self.elements[self.current]工作正常。 -
s的类型是什么?如果s: Selector<T>,则**s将无法编译。 -
我不小心放错了代码,
&mut self.elements[self.current]更好 -
我只是以
**s为例来说明我的想法。当然它不会编译,但我问 rust 是否使用了两个 deref_mut,一个调用我的 deref_mut 方法,另一个将生成的&mut T转换为mut T
标签: rust