我有一个Record
类型和一个get_key(&self) -> &str
方法(从记录内部借入返回的str
)。记录可能是可变的,但保证其键不会更改。
我想将记录列表存储在集合中,并能够通过其键检索记录。第一个想法是使用HashMap<String, Record>
,但是这似乎浪费了空间(因为键位置中的字符串是记录键的副本)。
我宁愿有一个HashMap<&str, Record>
,但是我无法提供&str
键的有效期(因为它们是从 inside 哈希表中借用的)。诸如rental或owning_ref之类的板条箱旨在处理这种自引用。但是,它们都没有针对此用例提供开箱即用的解决方案。
我寻找了提供这种“索引收藏”的板条箱,但无济于事。我想念什么吗? (我开始研究自己的解决方案,但我不想重新发明轮子)
答案 0 :(得分:3)
如果您想要一个容器,其中键本身是值的一部分,则可以将HashSet
与 newtype 一起使用以重新实现所需的特征:Hash
,{{ 1}},Borrow<str>
和PartialEq
。
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