使用 Box<None> 值初始化结构
Initialize struct with Box<None> value
我正在尝试用 Rust 制作一个抽认卡程序,它将以 json 格式保存。我为每张卡片制作了这个结构:
#[derive(Serialize, Deserialize)]
struct Card{
question:String,
answer: String,
status: Status,
strength: f32,
stability: f32,
difficulty: f32,
review_history: Vec<Review>,
children: Vec<Card>,
parent: Box<Option<Card>>
}
在这个应用程序中,一张卡片可能与树结构中的另一张卡片相关,所以这就是为什么有一个父变量和一个子向量。我了解到,如果一个结构引用自身,它必须在一个 Box 或类似的东西中,在我的例子中,并不是每张卡片都有一个父项,因为它可能是一个根,所以这就是为什么我也包含了 Option。我没有收到错误。
然而,当我尝试像这样初始化根卡时,出现错误:
let newcard = Card{
question: question,
answer: answer,
status: Status::Normal,
strength: 1f32,
stability: 1f32,
difficulty: 0.5f32,
review_history: review_history,
children: children,
parent: Box<None>,
};
我得到的错误是:父项上的“比较运算符不能链接”:Box 行。它建议使用 Box:: 但随后我收到错误消息“由于私有字段,构造函数不可见”。
我不确定哪些字段是私有的,我的结构、框或选项枚举?
我还想知道为什么编译器不抱怨 Vec 不在盒子里,因为我刚刚了解到你使用盒子来避免堆栈上的递归结构
只需使用Box::new
初始化值:
Box::new(None)
Also Im wondering why the compiler doesnt complain about Vec not
being in a box, since I just learned you use box to avoid recursive
structs on the stack
编译器不会抱怨 Vec<Card>
因为抱怨它毫无意义。 Vec 分配是堆,只有一个指针,len 和容量是基于堆栈的。
您可以查看 documentation 的保证部分中的信息:
A vector containing the elements 'a' and 'b' with capacity 4 can be
visualized as below. The top part is the Vec struct, it contains a
pointer to the head of the allocation in the heap, length and
capacity. The bottom part is the allocation on the heap, a contiguous
memory block.
ptr len capacity
+--------+--------+--------+
| 0x0123 | 2 | 4 |
+--------+--------+--------+
|
v
Heap +--------+--------+--------+--------+
| 'a' | 'b' | uninit | uninit |
+--------+--------+--------+--------+
我正在尝试用 Rust 制作一个抽认卡程序,它将以 json 格式保存。我为每张卡片制作了这个结构:
#[derive(Serialize, Deserialize)]
struct Card{
question:String,
answer: String,
status: Status,
strength: f32,
stability: f32,
difficulty: f32,
review_history: Vec<Review>,
children: Vec<Card>,
parent: Box<Option<Card>>
}
在这个应用程序中,一张卡片可能与树结构中的另一张卡片相关,所以这就是为什么有一个父变量和一个子向量。我了解到,如果一个结构引用自身,它必须在一个 Box 或类似的东西中,在我的例子中,并不是每张卡片都有一个父项,因为它可能是一个根,所以这就是为什么我也包含了 Option。我没有收到错误。
然而,当我尝试像这样初始化根卡时,出现错误:
let newcard = Card{
question: question,
answer: answer,
status: Status::Normal,
strength: 1f32,
stability: 1f32,
difficulty: 0.5f32,
review_history: review_history,
children: children,
parent: Box<None>,
};
我得到的错误是:父项上的“比较运算符不能链接”:Box
我不确定哪些字段是私有的,我的结构、框或选项枚举?
我还想知道为什么编译器不抱怨 Vec
只需使用Box::new
初始化值:
Box::new(None)
Also Im wondering why the compiler doesnt complain about Vec not being in a box, since I just learned you use box to avoid recursive structs on the stack
编译器不会抱怨 Vec<Card>
因为抱怨它毫无意义。 Vec 分配是堆,只有一个指针,len 和容量是基于堆栈的。
您可以查看 documentation 的保证部分中的信息:
A vector containing the elements 'a' and 'b' with capacity 4 can be visualized as below. The top part is the Vec struct, it contains a pointer to the head of the allocation in the heap, length and capacity. The bottom part is the allocation on the heap, a contiguous memory block.
ptr len capacity
+--------+--------+--------+
| 0x0123 | 2 | 4 |
+--------+--------+--------+
|
v
Heap +--------+--------+--------+--------+
| 'a' | 'b' | uninit | uninit |
+--------+--------+--------+--------+