使用 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)

Playground

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 |
       +--------+--------+--------+--------+