是否可以将结构插入到映射中,其中键由所插入的值拥有?
当在 C 中使用哈希映射时,这是我习惯做的事情。
伪代码示例:
struct MyStruct {
pub map: BTreeMap<&String, StructThatContainsString>,
// XXX ^ Rust wants lifetime specified here!
}
struct StructThatContainsString {
id: String,
other_data: u32,
}
fn my_fn() {
let ms = MyStruct { map: BTreeMap::new() };
let item = StructThatContainsString {
id: "Some Key".to_string(),
other_data: 0,
}
ms.insert(&item.id, item);
}
这种情况该如何正确处理呢?
它不适用于普通引用:
let item = StructThatContainsString {
id: "Some Key".to_string(),
other_data: 0,
}
ms.insert(&item.id, item);
item
is moved到地图中,因此不能有任何待处理的借用/引用。
另外,像这样的方法get_mut() https://doc.rust-lang.org/1.8.0/collections/struct.BTreeMap.html#method.get_mut会变得危险或不可能,因为它会让您修改具有突出引用的项目。
假设想要这样做的原因是为了节省空间,明显的选择是:
-
从值结构中取出键。如果您同时需要它,您可以在映射中查找键时获得它,或者迭代器同时包含键和值:
struct OnlyKey {
id: String,
}
struct OnlyValue {
other_data: u32,
}
这可以通过适当的方法来分解/重新组合各个部分来清理。
-
使用类似的东西Rc
为值的关键部分。Rc<T>
实施Ord
(需要BTreeMap
) if T
does.
struct StructThatContainsString {
id: Rc<String>,
other_data: u32,
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)