2013-12-22 3 views
6

Я пытаюсь узнать ржавчину из учебника. Я думал, что игра в жизнь Конвей будет хорошим местом для начала.Как инициализировать этот массив массивов внутри структуры?

У меня возникли проблемы с пониманием того, как написать эту сетку :: new() fn.

Вот что я до сих пор:

enum Cell { 
    alive, dead 
} 
impl Cell { 
    fn new() -> Cell { 
     alive 
    } 
struct Grid { 
    priv inner: [ [Cell, .. GRID_SIZE], .. GRID_SIZE], 
} 

impl Grid { 
    fn new() { 
     Grid { inner: ???? } 
    } 
} 

...

fn main() { 
    let grid = Grid::new(); // Stack allocated grid (internal stack allocad array) 
} 

То, что я хочу, чтобы сетка должна быть инициализирована с ячейками все значения «живой».

ответ

8

Grid::new должен инициализировать Grid::inner с вложенным массивом фиксированного размера буквальным, который написан так же, как тип, но значением, которое вы хотите, чтобы инициализировать массив с вместо типа Cell:

impl Grid { 
    fn new -> Grid { 
     Grid { inner: [[alive, ..GRID_SIZE], ..GRID_SIZE] } 
    } 
} 

(вы можете использовать Cell::new() вместо alive, если вы не хотите использовать функцию конструктора.)

inner члена может быть использован в выражениях следующим образом (обратите внимание, что priv контролирует только видимость закодировать о utside текущий модуль):

let grid = Grid::new(); 
let nested_fixed_sized_array: [[Cell, ..GRID_SIZE], ..GRID_SIZE] = grid.inner; 
let fixed_sized_array: [Cell, ..GRID_SIZE] = grid.inner[0]; 
let cell_element: Cell = grid.inner[0][0]; 

В Русте, вложенные массивы, как он использован в данном примере, представляют собой особый случай массивов фиксированного размера. Чтобы узнать, как это работает, см. Раздел руководства по адресу Vectors and Strings. В частности, в отличие от векторов (типа ~[T]), которые динамически выделяются в куче и могут изменять их длину (если они изменяемы), массивы фиксированного размера имеют длину, встроенную в тип ([T, ..LENGTH]), чтобы они могли После изменения будет изменен размер. T сам должен быть либо фиксированным, либо указательным. Однако взамен массивы фиксированного размера представляют собой типы значений, которые могут быть непосредственно распределены в стеке, встроенные в определения struct (например, Grid) и т. Д.

Поскольку массив фиксированного размера сам по себе является фиксированным размером, вложенный массив фиксированного размера - это особый случай, когда массив фиксированного размера является типом элемента массива фиксированного размера. В частности, память, занятая Grid::inner, равна точно GRID_SIZE * GRID_SIZE * sizeof(Cell) (если мы игнорируем выравнивание). Также полезен вектор массивов фиксированного размера ~[T, ..LENGTH], когда вы знаете количество столбцов в матрице, но не количество строк.

Оба вектора и массивы фиксированного размера могут служить аргументом функции, если аргумент является срезом (тип &[T]).

Некоторые детали могут измениться между настоящим и выпуском Rust 1.0. Если вам интересно, поиск Rust subreddit для «типов с динамическим размером» должен привести к предлагаемым изменениям и рассуждениям позади них, или вы всегда можете спросить об этом в Reddit или IRC-канале #rust.

+0

Спасибо! Быстро q, когда я пытаюсь переварить это, нужно объявить размер массива дважды, один раз в объявлении, и один раз в конструкторе (:: new()) обычные методы? структура сетки { внутренняя: [[Cell, .. GRID_SIZE], .. GRID_SIZE], } осущ Сетка { п новый() -> Сетка {внутренняя: [[жив, ..GRID_SIZE], .. GRID_SIZE]} } – Short

+1

Да, так вам и нужно. Размер массива явно является частью типа для массива фиксированного размера, поэтому вам нужно указать его в объявлении Grid. Затем вы создаете значение массива фиксированного размера с [[живым, ..GRID_SIZE], ..GRID_SIZE], где счетчик повторений ..GRID_SIZE определяет количество элементов. (Кроме того, литерал массива сам по себе имеет тип [T, ..LENGTH]. Например, [1, 1, 1] == [1, ..3] и [1, 1, 1] имеют тип [ int, ..3]). – telotortium

+0

Хорошо, круто. Поскольку тип содержит длину, имеет смысл, что он должен повторяться как при объявлении, так и при создании экземпляра. Благодаря! – Short

Смежные вопросы