假设我有一个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
,但我的函数在使用值之前需要解引用,我应该怎么做(如果可能的话)?
1条答案
按热度按时间8yoxcaq71#
v[0] = 7
不需要解引用,因为v[0]
是*v.index(0)
或*v.index_mut(0)
的语法糖,这取决于它的使用方式 *,也就是说,编译器会自动插入解引用,无论你在哪里使用索引语法,这大概是这样做的,所以索引的工作方式与其他语言相同,并且更容易使用。据我所知,没有办法为你自己的方法获得相同的行为。
Index
和IndexMut
的文档中可以看到