如何在 Rust 中返回自动取消引用的引用

Tud*_*abo 2 indexing struct reference traits rust

假设我有以下结构:

struct Vector {
    data: [f32; 2]
}
Run Code Online (Sandbox Code Playgroud)

实现 Index 特征很容易:

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

我也有这个实现:

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

从技术上讲,我可以做到这一点,但每次我想实际设置 x() 的值时,我都需要取消引用它:可以*v.x() = 7工作,但我v.x() = 7也想工作。

当我尝试第二个时,我收到错误:consider dereferencing here to assign to the mutably borrowed value: '*',我认为这是有道理的,但发生这种情况很奇怪,因为 IndexMut 返回与我的 x() 函数返回的相同的可变引用。

所以我的问题是:为什么 IndexMut 特征只适用于 do v[0] = 7,但我的函数需要在使用该值之前取消引用,以及我应该如何(如果可能的话)这样做?

caf*_*e25 5

v[0] = 7不需要取消引用,因为v[0]它是语法糖*v.index(0),或者*v.index_mut(0)取决于它的使用方式*,也就是说,无论您使用索引语法,编译器都会自动插入取消引用,这大概是这样做的,因此索引的工作方式与其他语言相同,并且有点小更容易使用。

据我所知,您自己的方法无法获得相同的行为。


Index*正如您从和 的文档中看到的那样IndexMut