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