Data structures Rust中的数据结构

Data structures Rust中的数据结构,data-structures,rust,Data Structures,Rust,我正在尝试将一个旧的个人Java项目转换为Rust作为一种学习体验。基本数据结构如下所示: 有一个主库。图书馆有作者列表和书籍列表 每个作者都有一份他/她写过的书的清单 每本书都有作者的参考资料 在Java程序中,我决定程序中的每本书(“霍比特人”)不应该存在多个对象。如果一本新书(可能通过用户输入)进入系统,我要做的第一件事就是测试它是否已经在库中,然后用库中的book对象替换用户输入。这大大简化了很多逻辑,因为你总是可以指望通过参考来比较书籍是有效的 无论如何,我现在正在Rust中重写这

我正在尝试将一个旧的个人Java项目转换为Rust作为一种学习体验。基本数据结构如下所示:

  • 有一个主
    图书馆
    有作者列表和书籍列表
  • 每个作者都有一份他/她写过的书的清单
  • 每本书都有作者的参考资料
在Java程序中,我决定程序中的每本书(“霍比特人”)不应该存在多个对象。如果一本新书(可能通过用户输入)进入系统,我要做的第一件事就是测试它是否已经在
库中,然后用
库中的book对象替换用户输入。这大大简化了很多逻辑,因为你总是可以指望通过参考来比较书籍是有效的

无论如何,我现在正在Rust中重写这段代码,我遇到了在内存中组织数据的问题

拥有一个由
作者组成的
是很简单的。然而,我如何组织我的书

在Java中,
包含一个
HashMap
和所有的书,这使得在固定时间内找到一本书成为可能。每个
作者
都有一个图书列表(按日期排序),这样就可以按作者列出所有图书

然而,除非我弄错了,否则Rust中的
Vec
不能包含对结构的引用。因此,在我看来,似乎不可能让每个
作者
都有一个指向
图书馆
中书籍的参考向量


我该怎么做?是否可以保留此结构,而不必拥有同一
书籍的多个副本
结构?我真的希望能够说
Library.get\u book(id)。设置标题(“新标题”)
,然后在整个程序中更改标题

考虑到您的代码示例已经具有ID,解决方案可以很简单:

  • 将有一个哈希映射或BTree映射,将
    图书ID
    映射到它的
    图书
  • 所有其他引用书籍的结构都是通过拥有其
    BookId
当然,对于
AuthorId
Author
您也会这样做


另一种可能是使用
Rc
Weak
,但是,除非仔细管理,否则可能会出现内存泄漏。

鉴于您的代码示例已经具有ID,解决方案可以很简单:

  • 将有一个哈希映射或BTree映射,将
    图书ID
    映射到它的
    图书
  • 所有其他引用书籍的结构都是通过拥有其
    BookId
当然,对于
AuthorId
Author
您也会这样做


另一种可能是使用
Rc
Weak
,但是,除非仔细管理,否则可能会出现内存泄漏。

您可以拥有一个引用结构的向量,但之后您将无法再修改结构。您可以拥有一个引用结构的向量,但是你将不能再修改结构了。啊,那么我假设你有一个HashMap?如果是这样的话,解决办法当然是显而易见的。我想我有点假设这不是一个选项,因为你不可能有一个向量references@PeterLudvigsen:通常,如果您可以向编译器证明引用将超过向量,则可以拥有引用向量。然而,在您的例子中,引用指向向量的兄弟,因此您无法证明它。因此,您将有一个
BTreeMap
和一个
BTreeMap
作为“权威”数据源,然后您的
作者可以包含一个
Vec
。啊,所以我假设您有一个HashMap?如果是这样的话,解决办法当然是显而易见的。我想我有点假设这不是一个选项,因为你不可能有一个向量references@PeterLudvigsen:通常,如果您可以向编译器证明引用将超过向量,则可以拥有引用向量。然而,在您的例子中,引用指向向量的兄弟,因此您无法证明它。因此,您将有一个
BTreeMap
和一个
BTreeMap
作为“权威”数据源,然后您的
作者可以包含一个
Vec