结构域的可变性取决于变量的可变性/所有权

时间:2019-04-26 09:33:22

标签: struct rust mutability

仅仅是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

如果这是事实,那么确保这两个功能(可变线和不可变线)均可用的最佳解决方案是什么?两种不同的类型(例如linelet a : Line = ...; // type of content = &[f32] let mut b : Line = ...; // type of = &mut [f32] )?

我也看到了ImmutLine和内部可变性,但是在那种情况下我认为它不是很有用:我知道在编译时我想要可变的还是不变的行。

0 个答案:

没有答案