跨结构成员的Rust寿命

时间:2019-12-24 18:55:22

标签: struct rust lifetime ownership

在以下(人为设计的)示例中,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的生存期相同,因此面部对其键的引用也将具有相同的生存期”。我认为这将基于所有权是隐式的,但事实并非如此,而且我不确定该如何表达。我也开始担心它根本不可行。

这有可能吗?如果可以,怎么办?

0 个答案:

没有答案