不能将struct作为类型来创建结构的2D数组

时间:2015-07-20 07:15:34

标签: rust

我正在尝试创建一个简单的,固定大小的节点结构的2D数组,其大小为[MAX_X,MAX_Y]。这样:

let mut map = [[Node; MAX_X as usize]; MAX_Y as usize];

struct Node {
    x: i32,
    y: i32,
}

给出错误消息:

main.rs:12:21: 12:25 error: `Node` is a struct variant name, but this expression uses it like a function name [E0423]
main.rs:12     let mut map = [[Node; MAX_X as usize]; MAX_Y as usize];
                               ^~~~
main.rs:12:21: 12:25 help: did you mean to write: `Node { /* fields */ }`?

我错过了什么?

2 个答案:

答案 0 :(得分:5)

这类似于说let mut i = i32;;它没有任何意义,因为你试图为变量分配一个类型。您需要实际提供,而不是类型。

然而,即使这样也不行,因为根据上面的定义,Node不是Copy,所以编译器无论如何都不能构造数组。 / p>

这里有一些可行的方法,但首先是一些注释:

  • 请注意,这是在堆栈上构建数组。如果你把它做得太大,你就会冒着堆栈溢出和崩溃的风险。

  • MAX_XMAX_Y 必须为常数;他们不能变数。你的铸造(缺乏一个完整的例子)让我担心你可能会使用变量..

fn main() {
    #[derive(Copy, Clone)]
    struct Node {
        x: i32,
        y: i32,
    }

    const MAX_X: usize = 8;
    const MAX_Y: usize = 16;

    let mut map = [[Node { x: 0, y: 0 }; MAX_X]; MAX_Y];
}

答案 1 :(得分:1)

  

let mut map = [[Node; MAX_X as usize]; MAX_Y as usize];

有两个问题

  • 生锈:用于定义变量类型,=用于定义其值。在您的情况下,您使用=来定义类型

  • 需要初始化所有变量(应分配内存)。

    • 如果MAX_XMAX_Y值是动态的,那么您无法选择但使用Vec<_>而不是固定大小的数组

    • 如果MAX_XMAX_Y是常量,那么您可以像这样静态初始化map(请注意推断出数据类型):let mut map = [[Node {x:0, y:0}, Node {x:0, y:0}, Node {x:0, y:0}], [Node {x:0, y:0}, Node {x:0, y:0}, Node {x:0, y:0}], [Node {x:0, y:0}, Node {x:0, y:0}, Node {x:0, y:0}]]