在rust中我如何返回一个引用,它是自动解引用的

to94eoyn  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(187)

假设我有一个struct:

struct Vector {
    data: [f32; 2]
}

实现Index trait很容易:

impl IndexMut<usize> for Vector {
    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
        &mut self.data[index]
    }
}

我也有这个实现:

impl Vector {
    fn x(&mut self) -> &mut T {
        &mut self.data[0]
    }
    fn y....
}

从技术上讲,我可以做到这一点,但每次我想实际设置x()的值时,我都需要解引用它:*v.x() = 7工作,但我希望v.x() = 7也工作。
当我尝试第二个时,我得到错误:consider dereferencing here to assign to the mutably borrowed value: '*',我想这是有道理的,但发生这种情况很奇怪,因为IndexMut返回的可变引用与我的x()函数返回的相同。
所以我的问题是:为什么IndexMut trait只做v[0] = 7,但我的函数在使用值之前需要解引用,我应该怎么做(如果可能的话)?

8yoxcaq7

8yoxcaq71#

v[0] = 7不需要解引用,因为v[0]*v.index(0)*v.index_mut(0)的语法糖,这取决于它的使用方式 *,也就是说,编译器会自动插入解引用,无论你在哪里使用索引语法,这大概是这样做的,所以索引的工作方式与其他语言相同,并且更容易使用。
据我所知,没有办法为你自己的方法获得相同的行为。

相关问题