如何在结构中初始化这个数组数组?

2024-01-03

我正在尝试从教程中学习 Rust。我认为康威的生命游戏将是一个很好的起点。

我无法理解如何编写这个 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”的单元格初始化网格。


Grid::new应该初始化Grid::inner使用嵌套的固定大小数组文字,其编写方式与类型类似,但使用要用来初始化数组的值来代替Cell type:

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

(您可以使用Cell::new()代替alive如果您更愿意使用构造函数。)

The 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];

在 Rust 中,本例中使用的嵌套数组是固定大小数组的一种特殊情况。 要了解其工作原理,请参阅教程部分向量和字符串 http://static.rust-lang.org/doc/master/tutorial.html#vectors-and-strings。特别是,与向量(类型~[T]),它们在堆上动态分配并且可以更改其长度(如果它们是可变的),固定大小数组的长度嵌入在类型中([T, ..LENGTH]),这样它们在创建后就不能改变大小。T本身必须是固定大小类型或指针。然而,作为交换,固定大小的数组是可以直接在堆栈上分配的值类型,嵌入在struct定义(如Grid), etc.

由于固定大小数组本身就是固定大小类型,因此嵌套固定大小数组只是一种特殊情况,其中固定大小数组是固定大小数组的元素类型。特别是,占用的内存Grid::inner正是GRID_SIZE * GRID_SIZE * sizeof(Cell)(如果我们忽略对齐)。固定大小数组的向量也很有用~[T, ..LENGTH],当您知道矩阵中的列数但不知道行数时。

如果参数是切片(类型&[T]).

从现在到 Rust 1.0 发布,一些细节可能会发生变化。如果你好奇的话,搜索一下Rust Reddit 子版块 http://reddit.com/r/rust对于“动态大小的类型”应该显示建议的更改及其背后的原因,或者您可以随时在 Reddit 或 #rust IRC 频道上询问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在结构中初始化这个数组数组? 的相关文章

随机推荐