我正在尝试从教程中学习生锈。我认为康威的生活游戏将是一个很好的起点。
我无法理解如何编写这个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)
}
我想要的是用网格初始化网格所有值'alive'。
答案 0 :(得分:8)
Grid::new
应该使用嵌套的固定大小的数组文字初始化Grid::inner
,该文字就像类型一样,但是要用初始化数组的值代替{{1}输入:
Cell
(如果您更愿意使用构造函数,则可以使用impl Grid {
fn new -> Grid {
Grid { inner: [[alive, ..GRID_SIZE], ..GRID_SIZE] }
}
}
代替Cell::new()
。)
然后可以在表达式中使用alive
成员,如下所示(请注意inner
仅控制当前模块外部代码的可见性):
priv
在Rust中,本示例中使用的嵌套数组是固定大小数组的特例。
要了解其工作原理,请参阅Vectors and Strings上的教程部分。特别是,与向量(类型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];
)不同,它们在堆上动态分配并且可以改变它们的长度(如果它们是可变的),固定大小的数组的长度嵌入在类型中{{1 }}),以便在创建后不能更改大小。 ~[T]
本身必须是固定大小的类型或指针。但是,作为交换,固定大小的数组是可以直接在堆栈上分配的值类型,嵌入在[T, ..LENGTH]
定义中(如T
)等。
由于固定大小的数组本身是固定大小的类型,因此嵌套的固定大小数组只是固定大小数组是固定大小数组的元素类型的特殊情况。特别是,struct
占用的内存正好是Grid
(如果我们忽略对齐)。当您知道矩阵中的列数而不是行数时,也可以使用固定大小的数组Grid::inner
的向量。
如果参数是切片(类型GRID_SIZE * GRID_SIZE * sizeof(Cell)
),则矢量和固定大小的数组都可以作为函数参数。
从现在到Rust 1.0的发布之间,一些细节可能会发生变化。如果您感到好奇,搜索Rust subreddit“动态大小的类型”应该会提出建议的更改及其背后的推理,或者您可以随时询问Reddit或#rust IRC频道。