不允许用户覆盖 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)
:
上实现 Index
和 IndexMut
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()
}
}
免责声明:请注意,此处使用 unwrap
并不干净。根据您的需要断言长度、处理选项或至少使用 expect
。
我目前正在开发自己的向量和矩阵库,为了简化我的生活,我将矩阵定义为向量的 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)
:
Index
和 IndexMut
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()
}
}
免责声明:请注意,此处使用 unwrap
并不干净。根据您的需要断言长度、处理选项或至少使用 expect
。