在以下(人为设计的)示例中,materials
的长度为<10,faces
的长度为10,000数量级。因此,这就是为什么我将materials
作为单独的地图而不是Face
上的属性存储的原因:
struct Mesh<'a> {
faces: Vec<Face<'a>>,
materials: HashMap<String,Material>,
}
impl<'a> Mesh<'a> {
fn new() -> Self {
let mut faces = Vec::new();
let mut materials = HashMap::new();
materials.insert(String::from("Default"), Material { });
for _ in 0..100 {
let mat_name = materials.keys().find(|&k| *k == "Default");
faces.push(Face { material_name: mat_name });
}
Self {
faces,
materials
}
}
}
struct Face<'a> {
material_name: Option<&'a str>,
}
struct Material {
// ...
}
如果我将material_name
克隆到每个Face
中,这是可行的,但是我真正想做的是将 references 存储到这10个字符串中,而不是分别克隆它们一千次所以我的想法是,“真实的” String
只是HashMap
键,并且每个面孔都可以存储一个引用。
这当然需要一些终生的恶作剧。
添加'a
后,我遇到一个错误:
error[E0308]: mismatched types
--> src/lib.rs:19:46
|
19 | faces.push(Face { material_name: mat_name });
| ^^^^^^^^ expected str, found struct `std::string::String`
|
= note: expected type `std::option::Option<&str>`
found type `std::option::Option<&std::string::String>`
我想表达的是,“ HashMap的生存期将与Mesh的生存期相同,因此面部对其键的引用也将具有相同的生存期”。我认为这将基于所有权是隐式的,但事实并非如此,而且我不确定该如何表达。我也开始担心它根本不可行。
这有可能吗?如果可以,怎么办?