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

时间:2016-11-03 05:23:20

标签: pointers rust

我正在通过矩阵数学来学习Rust。第一步是创建一个新的行和列矩阵,并使用行 - 主要顺序的值初始化矩阵。

如果我想将输入矩阵值向量作为&amp; [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;

}

基于此post,&amp; [T]是对在存储器中顺序排列的一组Ts的引用。这是否意味着无法将所有“切片”从指针转换为矢量类型?并且唯一的方法是使用循环来对每个项目进行deref并将它们存储在新的向量中吗?

1 个答案:

答案 0 :(得分:5)

可以,但不能通过*(取消引用)。你知道,&[T]借来的东西,所以你无法保留它。类型Matrix<T> 拥有data。你不能简单地借用一些东西(values),然后就像你拥有它一样放弃它(&#34;在这里,Matrix,采取这些值,你可以保留它们&#34;)。

您可以做的是复制借来的数据并将其存储为自有类型(Vec<T>)。您现在可以放弃此数据副本,因为您拥有它。从借用转换为拥有可以通过to_owned()方法完成,例如:

pub fn new(row: usize, col: usize, values: &[T]) -> Matrix<T> {
    Matrix {
        data: values.to_owned(),
        //          ^^^^^^^^^^^
        row: row,
        col: col,
    }
}