我正在通过矩阵数学来学习Rust.第一步是创建一个新的行和列矩阵,并使用行 - 主要顺序的值初始化矩阵.
如果我想将输入矩阵值向量作为&[T]传递,但我不确定如何使用元素值初始化矩阵.
pub struct Matrix<T> {
data: Vec<T>,
row: usize,
col: usize,
}
/// Creates a new matrix of `row` rows and `col` columns, and initializes
/// the matrix with the elements in `values` in row-major order.
pub fn new(row: usize, col: usize, values: &[T]) -> Matrix<T> {
Matrix {
data: *values, // ??
row: row,
col: col,
}
}
fn main() {
let x = Matrix::new(2, 3, &[-2, -1, 0, 1, 2, 3]);
let y = Matrix::new(2, 3, &[0, 0, 0, 0, 0, 0]);
// z = x + y;
}
Run Code Online (Sandbox Code Playgroud)
基于这篇文章,&[T]是对在存储器中顺序排列的一组Ts的引用.这是否意味着无法将所有"切片"从指针转换为矢量类型?并且唯一的方法是使用循环来对每个项目进行deref并将它们存储在新的向量中?
这是可能的,但不是通过*(解除引用).你看,&[T]是借来的东西,所以你不能保留它.该类型Matrix<T> 拥有它data.你不能简单地借用某些东西(values),然后把它当作你拥有它一样放弃("这里,Matrix,取这些值,你可以保留它们").
您可以做的是复制借来的数据并将其存储为拥有的类型(Vec<T>).您现在可以放弃此数据副本,因为您拥有它.从借用转换为拥有可以通过该to_owned()方法完成,例如:
pub fn new(row: usize, col: usize, values: &[T]) -> Matrix<T> {
Matrix {
data: values.to_owned(),
// ^^^^^^^^^^^
row: row,
col: col,
}
}
Run Code Online (Sandbox Code Playgroud)