【问题标题】:What is the difference between * and the deref method? [duplicate]* 和 deref 方法有什么区别? [复制]
【发布时间】: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 正在做&amp;s.elements[s.current] = 'w's.elements.index_mut(s.current) = 'w'; 相同 除了 index_mut 返回一个引用,你不能分配一个引用,所以我将上面的内容更改为 *&amp;mut *s.elements.index_mut(s.current) = 'w';

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

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

【问题讨论】:

  • 为什么你的代码直接调用index_mut&amp;mut self.elements[self.current] 工作正常。
  • s的类型是什么?如果s: Selector&lt;T&gt;,则**s 将无法编译。
  • 我不小心放错了代码,&amp;mut self.elements[self.current]更好
  • 我只是以**s为例来说明我的想法。当然它不会编译,但我问 rust 是否使用了两个 deref_mut,一个调用我的 deref_mut 方法,另一个将生成的 &amp;mut T 转换为 mut T

标签: rust


【解决方案1】:

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

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

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

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

【讨论】:

  • 当我执行 *s 时,第一个 * 调用我的 deref_mut 方法,但 rust 必须将 deref_mut 返回的 &amp;mut T 转换为 T,就像你说的那样。这是否意味着 rust 在将第一个 * 转换为我的 deref_mut 以转换参考之后插入另一个 * ?我在做*s 时只使用了一个*`,所以我问rust 是否隐式插入另一个*
  • 不,它不会插入另一个*deref_mut 方法将&amp;mut Selector&lt;T&gt; 转换为&amp;mut T* 运算符将&amp;mut T 转换为T
猜你喜欢
  • 2022-10-14
  • 2011-05-07
  • 2013-09-20
  • 2015-07-17
  • 2012-09-04
  • 2022-11-07
  • 2015-11-23
  • 2013-02-13
  • 2011-04-26
相关资源
最近更新 更多