不允许用户覆盖 DerefMut 结构的值,但允许它在其上执行可变函数

Don't allow user to override value of DerefMut struct, but allow it to execute mutable function on it

我目前正在开发自己的向量和矩阵库,为了简化我的生活,我将矩阵定义为向量的 Vec,并定义了 Deref 特征:

pub struct Matrix(Vec<RowVector>);

impl Deref for Matrix {
    type Target = [RowVector];

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

impl DerefMut for Matrix {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.0
    }
}

这很有效,但它有一个缺陷:您可以将一行覆盖为与其余行不同大小的 RowVector,这显然非常糟糕。

我注定要失败吗?是否有禁止覆盖但允许改变 Vector 的解决方案?

您可以在一对 (usize, usize):

上实现 IndexIndexMut
use std::ops::{IndexMut, Index};

pub struct Matrix(Vec<Vec<usize>>);


impl Index<(usize, usize)> for Matrix {
    type Output = usize;

    fn index(&self, index: (usize, usize)) -> &Self::Output {
        self.0.get(index.0).unwrap().get(index.1).unwrap()
    }
}

impl IndexMut<(usize, usize)> for Matrix {
    fn index_mut(&mut self, index: (usize, usize)) -> &mut Self::Output {
        self.0.get_mut(index.0).unwrap().get_mut(index.1).unwrap()
    }
}

Playground

免责声明:请注意,此处使用 unwrap 并不干净。根据您的需要断言长度、处理选项或至少使用 expect