我正在通过矩阵数学来学习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,&amp; [T]是对在存储器中顺序排列的一组Ts的引用。这是否意味着无法将所有“切片”从指针转换为矢量类型?并且唯一的方法是使用循环来对每个项目进行deref并将它们存储在新的向量中吗?
答案 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,
}
}