在Rust中构建数据

时间:2016-03-18 14:23:54

标签: data-structures rust

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

  • 有一个主LibraryLibrary有作者列表和书籍列表。
  • 每位作者都有他/她撰写的书籍清单。
  • 每本书都提到了它的作者。

在Java程序中,我决定在程序中每本书(" The Hobbit")不应该存在多个对象。如果一本新书(可能通过用户输入)进入系统,我要做的第一件事就是测试它是否已经在Library中,然后将用户输入替换为{{1的书籍对象}}。这大大简化了很多逻辑,因为你总是可以指望通过引用来比较书籍是有效的。

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

拥有Library集合Library的{​​{1}}是直截了当的。但是,我如何整理书籍?

在Java中,Authors包含一个Library,其中包含所有可以在固定时间内查找图书的书籍。每个HashMap还有一个书籍列表(按日期排序),这样就可以列出作者的所有书籍。

但是,除非我弄错了,否则Rust中的Author不能包含对结构的引用。所以,对我来说,似乎不可能让每个Vec都有Author中书籍的引用向量。

我该怎么做?是否可以保留此结构而不具有相同Library结构的多个副本?我真的希望能够说Book然后在整个程序中更改标题。

1 个答案:

答案 0 :(得分:2)

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

  • Library会有一个哈希映射或BTree将BookId映射到其Book
  • 引用某本书的所有其他结构都是通过复制其BookId
  • 来实现的

当然,您也可以使用AuthorIdAuthor执行相同操作。

另一种可能性是使用RcWeak,但除非谨慎管理,否则可能会出现内存泄漏。