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);