有没有办法重载索引赋值运算符?

Joh*_*ess 6 operator-overloading rust

我可以重载[]运算符Index以返回引用,但我不知道是否有重载运算符可以分配给对象。

这就是我想要做的:

point[0] = 9.9;
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我可以做的(获取值):

use std::ops::Index;

#[derive(Debug, Clone, Copy)]
pub struct Vec3 {
    e: [f32; 3],
}

impl Index<usize> for Vec3 {
    type Output = f32;
    fn index<'a>(&'a self, i: usize) -> &'a f32 {
        &self.e[i]
    }
}

fn main() {
    let point = Vec3 { e: [0.0, 1.0, 3.0] };
    let z = point[2];
    println!("{}", z);
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 8

您正在使用Index,它在其文档中说明了这一点:

如果请求可变值,IndexMut则改为使用。

use std::ops::{Index, IndexMut};

#[derive(Debug, Clone, Copy)]
pub struct Vec3 {
    e: [f32; 3],
}

impl Index<usize> for Vec3 {
    type Output = f32;
    fn index<'a>(&'a self, i: usize) -> &'a f32 {
        &self.e[i]
    }
}

impl IndexMut<usize> for Vec3 {
    fn index_mut<'a>(&'a mut self, i: usize) -> &'a mut f32 {
        &mut self.e[i]
    }
}

fn main() {
    let mut point = Vec3 { e: [0.0, 1.0, 3.0] };
    point[0] = 99.9;
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • @JohnEstess *相当迟钝的例子*——Rust 致力于提供良好的文档。我敢肯定,如果您提交了一个问题来解释该示例为何会抛出您的问题,那么有人会很感激您的反馈并可能会相应地调整该示例。 (3认同)