首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建视图结构失败,因为"cast需要为`‘static`借用变量“

创建视图结构失败,因为"cast需要为`‘static`借用变量“
EN

Stack Overflow用户
提问于 2020-06-30 13:03:28
回答 2查看 192关注 0票数 1

我正在开发一个业余爱好游戏引擎,我有一个结构Mesh和一个用Instance查看它的视图

代码语言:javascript
复制
struct Mesh {
    // Vertex info, etc
}

struct Instance<'a> {
    mesh: &'a Mesh,
    transform: Mat4,
}

在我看来,这正是生命周期规则的目的;我声明Instance的生命周期必须比它所引用的Mesh的生命周期短。

当我尝试在main函数中使用它时:

代码语言:javascript
复制
fn main() {
    let mesh = Mesh::new();

    // Add vertices, etc

    // Scene has a Vec<Box<dyn Drawable>>, which Instance implements.
    let mut scene = Scene::new(glam::Mat4::zero());
    scene.push(Box::new(Instance::new(&mesh, glam::Mat4::zero())));

    render_scene(scene)
}

我从借入检查器中得到以下错误:

代码语言:javascript
复制
error[E0597]: `mesh` does not live long enough
  --> bin/rendertest.rs:9:39
   |
9  |     scene.push(Box::new(Instance::new(&mesh, glam::Mat4::zero())));
   |                -----------------------^^^^^----------------------
   |                |                      |
   |                |                      borrowed value does not live long enough
   |                cast requires that `mesh` is borrowed for `'static`
...
12 | }
   | - `mesh` dropped here while still borrowed

它谈论的演员阵容是什么?为什么它需要网格是'static的?当main退出时,网格似乎应该会在render_scene的回归之后存活下来。

EN

回答 2

Stack Overflow用户

发布于 2020-06-30 13:37:22

这里的关键问题是Box<dyn T>等同于Box<dyn T + 'static>。但这只是默认的生存期--您可以通过编写Box<dyn T + 'a>来覆盖它。

您需要更改的唯一一件事是为Scene提供生命周期,并将其传递给包含的Boxes。

代码语言:javascript
复制
struct Scene<'a> {
    entries: Vec<Box<dyn Drawable + 'a>>,
}

impl<'a> Scene<'a> {
    pub fn new() -> Scene<'a> {
        Scene { entries: vec![] }
    }
}

playground上提供了完整的示例

票数 2
EN

Stack Overflow用户

发布于 2020-06-30 17:24:38

最后,我发现使用std::rc::Rc制作Instance是最简单的

代码语言:javascript
复制
struct Instance {
    mesh: Rc<Mesh>,
    transform: Mat4
}

在语义上,这并不真正符合预期:网格在游戏运行结束之前不需要删除,所以我不需要计算对它们的引用。但它使我不必向Scene对象和任何其他具有Scene的对象添加大量显式生命周期。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62650594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档