【发布时间】:2018-01-24 10:29:59
【问题描述】:
我正在用 Rust 实现矩阵。该代码已针对示例进行了修改,但可能存在一些小错误:
#[derive(Debug, PartialEq)]
pub struct Matrix<T> {
inner: Vec<Vec<T>>,
}
impl<T> Matrix<T> {
pub fn dim(&self) -> (usize, usize) {
if self.inner.len() == 0 {
(0, 0)
} else {
(self.inner.len(), self.inner[0].len())
}
}
}
我希望有能力得到矩阵的象限:
+----+----+
| Q1 | Q2 |
+----+----+
| Q3 | Q4 |
+----+----+
我引入了Slice 和SliceMut 结构来借用矩阵的一部分:
pub struct Slice<'a, T: 'a> {
matrix: &'a Matrix<T>,
start: (usize, usize),
end: (usize, usize),
}
pub struct SliceMut<'a, T: 'a> {
matrix: &'a mut Matrix<T>,
start: (usize, usize),
end: (usize, usize),
}
现在我要实现两个功能:
-
quadrants- 得到四个切片的元组 -
quadrants_mut- 获取四个可变切片的元组
我不能在quadrants_mut 中多次可变地借用一个矩阵:
fn quadrants_mut<'a, T>(matrix: &'a mut Matrix<T>) -> (SliceMut<'a, T>, SliceMut<'a, T>, SliceMut<'a, T>, SliceMut<'a, T>) {
let (rows, cols) = matrix.dim();
let mid_rows = rows / 2;
let mid_cols = cols / 2;
let a = SliceMut { matrix: matrix, start: (0, 0), end: (mid_rows, mid_cols) };
let b = SliceMut { matrix: matrix, start: (0, mid_rows), end: (mid_cols, cols) };
let c = SliceMut { matrix: matrix, start: (mid_rows, rows), end: (0, mid_cols) };
let d = SliceMut { matrix: matrix, start: (mid_rows, rows), end: (mid_cols, cols) };
(a, b, c, d)
}
当我尝试编译它时,我有一个错误:
error[E0499]: cannot borrow `*matrix` as mutable more than once at a time
--> src/matrix/slice.rs:62:13
|
59 | let a = SliceMut { matrix: matrix, start: (0, 0), end: (mid_rows, mid_cols) };
| ------ first mutable borrow occurs here
...
60 | let b = SliceMut { matrix: matrix, start: (0, mid_rows), end: (mid_cols, cols) };
| ^^^^^^ second mutable borrow occurs here
...
66 | }
我试图可变地借用一个矩阵四次。我应该如何更改代码以使其编译?
【问题讨论】:
-
也许不是返回一个元组,而是返回一个结构,其中包含
a、b、c和d,然后让该结构保存引用?不过,很可能有一种更惯用的方式来实现这一点。 -
Vec::split_at_mut将是第一步。 -
性能良好的矩阵不使用
Vec<Vec<T>>,而是使用Vec<T>来避免额外的间接性。 -
矩阵实现可以用一个单个向量来实现,并且通过根据所需的列和行计算右索引来访问象限。
标签: rust