我正在尝试创建一个简单的,固定大小的节点结构的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 */ }`?
我错过了什么?
答案 0 :(得分:5)
这类似于说let mut i = i32;
;它没有任何意义,因为你试图为变量分配一个类型。您需要实际提供值,而不是类型。
然而,即使这样也不行,因为根据上面的定义,Node
不是Copy
,所以编译器无论如何都不能构造数组。 / p>
这里有一些可行的方法,但首先是一些注释:
请注意,这是在堆栈上构建数组。如果你把它做得太大,你就会冒着堆栈溢出和崩溃的风险。
MAX_X
和MAX_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_X
和MAX_Y
值是动态的,那么您无法选择但使用Vec<_>
而不是固定大小的数组
如果MAX_X
和MAX_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}]]