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