2013-12-22 66 views
6

我試圖從教程中學習生鏽。我認爲康威的人生遊戲將是一個開始的好地方。如何在結構中初始化這個數組數組?

我無法理解如何編寫這個Grid :: 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]),則矢量和固定大小的數組都可以用作函數參數。

一些細節可能會改變從現在到Rust 1.0的發佈。如果你很好奇,在Rust subreddit上搜索「動態大小的類型」應該提出建議的更改和背後的推理,或者你總是可以在Reddit或#rust IRC頻道上提問。

+0

謝謝!當我嘗試消化這個時,快速q,是不得不聲明數組大小兩次,一次在聲明中,一次在構造函數(:: new())方法中正常? 結構網格{ 內:[[細胞,.. GRID_SIZE],.. GRID_SIZE], } IMPL網格{ FN新() - >網格{內:[[活着,..GRID_SIZE],.. GRID_SIZE]} } – Short

+1

是的,你就是這麼做的。數組大小明確是固定大小數組類型的一部分,因此您必須在Grid的聲明中指定它。然後用[[alive,..GRID_SIZE],..GRID_SIZE]生成一個固定大小的數組值,其中重複計數..GRID_SIZE指定了有多少個元素。 (此外,數組本身具有類型[T,..LENGTH]。例如,[1,1,1] == [1,3.3]和[1,1,1]的類型爲[ int,..3])。 – telotortium

+0

好的,很酷。由於該類型包含長度,因此必須在聲明和實例化時重複它。謝謝! – Short