将类型&[T]的输入向量转换为Vec <T>

ena*_*naJ 0 pointers rust

我正在通过矩阵数学来学习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并将它们存储在新的向量中?

Luk*_*odt 5

这是可能的,但不是通过*(解除引用).你看,&[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)