仅仅是Rust新手的一个天真问题;如您所料,它与所有权和可变性有关...
问题如下:我有某种用作矩形矩阵的数组结构。
struct Matrix {
lines: usize,
columns: usize,
content: Vec<f32>,
}
在内部,一维数组content
(大小为lines*columns
)代表整个矩形矩阵m
,其中m(i,j) = content[i*columns+j]
对于任何给定的i
和{ {1}}。
我想从这个矩阵中提取一行。但是出于种种原因,我也想保留该行的大小,即矩阵的列数(以及一般而言,最终会得到一些额外的信息)。
为此,我使用了一种新类型,j
。
Line
我的猜测是,我使用切片表示一行,因为它是内存中的连续空间。然后,我可以像这样实现struct Line<'a> {
columns: usize,
content: &'a [f32],
}
函数:
line()
但是那里存在一个问题:impl Matrix {
fn line(&'a self, id: usize) -> Line<'a> {
let realindex = id * self.columns;
&self.content[realindex..realindex+self.columns]
}
}
的{{1}}字段是不可变的。我可能想修改content
的内容,希望它会更改拥有矩阵的内容。
在那种情况下,我想我可以写这个并且行得通:
Line
我可以编写一些Line
函数来获取此结构:
struct Line<'a> {
columns: usize,
content: &'a mut [f32],
}
但是,如果我想简单地从矩阵中获得一条不变的线,会发生什么?在line_mut
的第一个版本中,我无法使用impl Matrix {
fn line(&'a mut self, id: usize) -> Line<'a> {
let realindex = id * self.columns;
&mut self.content[realindex..realindex+self.columns]
}
}
并获得可变的行;相反,在第二版Line
中,我无法使用line_mut
并获得不可变的行...
问题如下:我是在想什么吗?还是那样?换句话说,有没有一种方法可以使Rust在使用struct时根据所需的可变性来推断某些struct字段的可变性?像这样:
Line
如果这是事实,那么确保这两个功能(可变线和不可变线)均可用的最佳解决方案是什么?两种不同的类型(例如line
和let a : Line = ...; // type of content = &[f32]
let mut b : Line = ...; // type of = &mut [f32]
)?
我也看到了ImmutLine
和内部可变性,但是在那种情况下我认为它不是很有用:我知道在编译时我想要可变的还是不变的行。