代码之家  ›  专栏  ›  技术社区  ›  Tor

使用Box<None>值初始化struct

  •  1
  • Tor  · 技术社区  · 2 年前

    我正在尝试用rust制作一个flashcard程序,它将以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>>
    }
    

    在这个应用程序中,一张卡片可能与树结构中的另一张卡片相关,因此可以解释为什么有父变量和子向量。我了解到,如果一个结构指的是它自己,它必须在一个盒子或类似的东西中,在我的例子中,并不是每一张卡都有一个父卡,因为它可能是一个根,所以我还包括了选项。我在这方面没有错误。

    但是,当我尝试像这样初始化根卡时,会出现一个错误:

    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:<无>但是我得到了一个错误“由于私有字段,构造函数不可见”。

    我不确定哪些字段是私有的、my struct、box还是enum选项?

    我还想知道为什么编译器不抱怨Vec<卡片>不是在一个盒子里,因为我刚刚学会了使用盒子来避免堆栈上的递归结构

    1 回复  |  直到 2 年前
        1
  •  1
  •   Netwave    2 年前

    使用 Box::new 要初始化该值,请执行以下操作:

    Box::new(None)
    

    Playground

    我还想知道为什么编译器不抱怨Vec 在一个盒子里,因为我刚刚知道你用盒子来避免递归 堆栈上的结构

    不要抱怨 Vec<Card> 因为抱怨是没有意义的。Vec分配是基于堆的,只有len和容量的指针是基于堆栈的。

    您可以查看 documentation :

    包含容量为4的元素“A”和“b”的向量可以是 如下所示。顶部是Vec结构,它包含 指向堆中分配头的指针、长度和 容量底部是堆上的分配,一个连续的 内存块。

                ptr      len  capacity
           +--------+--------+--------+
           | 0x0123 |      2 |      4 |
           +--------+--------+--------+
                |
                v
    Heap   +--------+--------+--------+--------+
           |    'a' |    'b' | uninit | uninit |
           +--------+--------+--------+--------+