如何按其字段之一索引一组记录?

时间:2018-12-11 07:05:14

标签: collections rust

我有一个Record类型和一个get_key(&self) -> &str方法(从记录内部借入返回的str)。记录可能是可变的,但保证其键不会更改。

我想将记录列表存储在集合中,并能够通过其键检索记录。第一个想法是使用HashMap<String, Record>,但是这似乎浪费了空间(因为键位置中的字符串是记录键的副本)。

我宁愿有一个HashMap<&str, Record>,但是我无法提供&str键的有效期(因为它们是从 inside 哈希表中借用的)。诸如rentalowning_ref之类的板条箱旨在处理这种自引用。但是,它们都没有针对此用例提供开箱即用的解决方案。

我寻找了提供这种“索引收藏”的板条箱,但无济于事。我想念什么吗? (我开始研究自己的解决方案,但我不想重新发明轮子)

1 个答案:

答案 0 :(得分:3)

如果您想要一个容器,其中键本身是值的一部分,则可以将HashSet newtype 一起使用以重新实现所需的特征:Hash,{{ 1}},Borrow<str>PartialEq

例如(link to playground)

Eq

现在struct HRecord(Record); impl Hash for HRecord { fn hash<H: Hasher>(&self, state: &mut H) { self.0.get_key().hash(state); } } impl PartialEq for HRecord { fn eq(&self, r: &HRecord) -> bool { self.0.get_key().eq(r.0.get_key()) } } impl Eq for HRecord {} impl Borrow<str> for HRecord { fn borrow(&self) -> &str { self.0.get_key() } } 可以工作了:

HashMap