2016-11-03 7 views
0

Я изучаю ржавчину, делая математическую матрицу. Самый первый шаг - создать новую матрицу строк и столбцов и инициализировать матрицу с элементами значений в строчном порядке.конвертировать входной вектор типа & [T] в Vec <T>

Если я хочу передать вектор значения матрицы ввода как & [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, & [Т] является ссылкой на набор Ts изложены последовательно в памяти. Означает ли это, что невозможно преобразовать все «срезы» из указателей в тип вектора? И единственный способ сделать это - использовать цикл, чтобы сделать deref каждого элемента и сохранить их в новом векторе?

+0

Лично я бы просто сделать 'new' принять' Vec'. Таким образом, вы не накладываете клоун на вызывающего абонента; вызывающий может решить клонировать данные или просто передать права собственности на их 'Vec', если они больше не нужны. –

ответ

5

Возможно, но не через * (разыменование). Понимаете, &[T] что-то заимствовал, так что вы не можете его сохранить. Тип Matrix<T>принадлежит его data. Вы не можете просто взять что-то (values), а затем отдать его, как если бы вы его владеете («здесь, Матрица, возьмите эти значения, вы можете их сохранить»).

Что вы можете сделать, это копировать заимствованные данные и хранить их как принадлежащие им типы (Vec<T>). Теперь вы можете отдать эту копию данных, потому что вы ее владеете. Преобразование из заимствовали Подержанный может быть сделано с помощью метода to_owned(), например:

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

Спасибо @Lukas, следующий вопрос: если с помощью to_own(), функция fn new() принимает собственность на матрицу, тогда исходная матрица не существует. Если я хочу сделать добавление матрицы, это будет проблемой, верно? Я думаю, может быть, я должен инициализировать новую матрицу, не взяв на себя ответственность. – enaJ

+1

@enaJ Я не совсем понимаю, но функция 'new()' не получает права собственности ни на что. 'to_owned()' принимает * заимствованную вещь, копирует ее и возвращает * принадлежащую * вещь. Например, если друг предоставляет вам книгу. Лучше не писать в эту книгу или притворяться, что она твоя. Но если вы скопируете буквенное письмо на письмо, у вас есть своя версия, которую вы * вы *. –

+0

Так to_owned() сделать копию заимствованного объекта. В этом есть смысл. Кстати, мне очень нравятся ваши аналоги. – enaJ