【问题标题】:convert input vector of type &[T] to Vec<T>将 &[T] 类型的输入向量转换为 Vec<T>
【发布时间】:2016-11-03 05:23:19
【问题描述】:

我通过做矩阵数学来学习 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;

}

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

【问题讨论】:

  • 就个人而言,我会让new 接受Vec。这样你就不会对调用者强加一个克隆;调用者可以决定克隆数据,或者如果他们不再需要它,则只传递其Vec 的所有权。

标签: pointers rust


【解决方案1】:

这是可能的,但不是通过*(取消引用)。你看,&amp;[T]借来的,所以你不能保留它。 Matrix&lt;T&gt; 类型拥有它的data。你不能简单地借一些东西(values)然后把它送出去,就好像你拥有它一样(“这里,Matrix,把这些值拿走,你可以保留它们”)。

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

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

【讨论】:

  • 感谢@Lukas,一个后续问题:如果通过使用 to_own(),fn new() 获得了 matrix 的所有权,那么原始矩阵不存在。如果我想做矩阵加法,那将是一个问题,对吧?我在想也许我应该在不获取所有权的情况下初始化新矩阵..
  • @enaJ 我不太明白,但new() 函数不拥有任何东西。 to_owned() 获取一个 borrowed 事物,复制它并返回一个 owned 事物。就像朋友借一本书给你一样。你最好不要在那本书上写信或假装它是你自己的。但是,如果您逐信复制书信,则拥有自己的版本。
  • 所以 to_owned() 复制借来的对象。这就说得通了。顺便说一句,我真的很喜欢你的类比。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多