Collections 如何按记录的某个字段为记录集合编制索引?

Collections 如何按记录的某个字段为记录集合编制索引?,collections,rust,Collections,Rust,我有一个Record类型,带有get_key(&self)->&str方法(从记录内部借用返回的str)。记录可能是可变的,但其密钥保证不会更改 我希望在集合中存储一个记录列表,并能够通过其键检索记录。第一个想法是使用HashMap,但这看起来像是浪费空间(因为键位置的字符串是记录键的副本) 我希望有一个HashMap,但我不能为&str键提供一个生存期(因为它们是从HashMap内部借用的)。这是板条箱喜欢或设计用来处理的一种自我参照。但是,它们都没有为此用例提供现成的解决方案 我寻找了一个提

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

我希望在集合中存储一个记录列表,并能够通过其键检索记录。第一个想法是使用
HashMap
,但这看起来像是浪费空间(因为键位置的字符串是记录键的副本)

我希望有一个
HashMap
,但我不能为
&str
键提供一个生存期(因为它们是从HashMap内部借用的)。这是板条箱喜欢或设计用来处理的一种自我参照。但是,它们都没有为此用例提供现成的解决方案


我寻找了一个提供这种“索引收集”的板条箱,但没有结果。我错过什么了吗?(我开始破解我自己的解决方案,但我不想再发明轮子)

如果你想要一个容器,其中键本身就是值的一部分,你可以使用带有新类型的
HashSet
来重新实现所需的特性:
Hash
Borrow
PartialEq
Eq

例如:


HashMap
怎么样?@Jmb这应该是一个答案。也许你可以使用
HashSet
,让
WrapperRecord
包含
记录
,并实现
Hash
借用
。这确实是一种不需要自引用就可以实现的好方法。我没有想到实现借用,这样我就可以在h.get(…)中使用&str了。但是,我想要的是一个类型抽象这个机制,这样用户就不必处理btw记录和HRecords了。。。任何提供该功能的板条箱?@Pierre Antoine:嗯,您可以轻松地将
散列集
包装到
记录集
中,并公开正确的
插入(&mut self,r:Record)
获取(&self,&str)->&Record
函数,并将
HRecord
保密,但是我必须镜像所有常用的容器方法(iter、len、shrink_to_fit…),这很麻烦,而且可以分解为泛型类型,因此我的问题是。@Pierre Antoine:当然,这取决于你。但为此实施
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()
    }
}
let mut h = HashSet::new();
h.insert(HRecord(Record { ... }));
let obj = h.get("...").map(|h| &h.0);