gpt4 book ai didi

sfml - Rust (+SFML) - 如何在受生命周期参数限制时避免额外的对象构造?

转载 作者:行者123 更新时间:2023-11-29 08:28:08 28 4
gpt4 key购买 nike

我正在使用 rust-sfml ( rsfml::graphics ) 目前,将像素绘制到屏幕上。 (我只是从 Rust 和项目开始。)我将数据存储在 Image 中。 , 然后复制到 Texture .

Texture用于创建 Sprite<'s> ;这就是我的问题。我需要能够改变 Texture , 但 Sprite<'s> 的类型似乎保证我不能做我想做的事。因为我需要能够调用 window.draw(&sprite)每次重新绘制窗口时,我只是创建一个新的 Sprite每次。

更好的选择是保留 Sprite<'s>在我的 struct Render连同 Texture .由于“Sprite”有一个生命周期参数,它变成了struct Render<'s> :

struct Render<'s> {
texture: Texture,
sprite: Sprite<'s>,
}

我在 Render 上有一个方法:

fn blit(&'s mut self) -> ()

它改变了 Render (通过编辑 Texture )。现在,只要我试着调用 blit我不止一次遇到这个问题:

render.blit();
render.blit(); // error: cannot borrow `render` as mutable more than once at a time

我认为,这是因为生命周期参数强制了 Render第一个借用的生命周期- blit -调用等于Render的生命周期实例(整个主要功能)。

我怎样才能保留我原来的Sprite并继续能够改变容器?可能吗?

这是一个看起来很愚蠢而且相当简单的例子:

extern crate rsfml;

use rsfml::graphics::Sprite;

fn main() -> () {
let mut render = Render::new();
render.blit();
render.blit(); // error: cannot borrow `render` as mutable more than once at a time
}

struct Render<'s> {
sprite: Option<Sprite<'s>>,
}

impl<'s> Render<'s> {
fn new() -> Render { Render { sprite: None } }
fn blit(&'s mut self) -> () { }
}

(如果问题不清楚,请见谅。如果我对这些概念不是很熟悉,很难表达。)

最佳答案

当您调用 blit 时,有两个生命周期在考虑中; self ,你看,类型是 &'ρ₀ Render<'ρ₁>对于某些生命周期 ρ₀ 和 ρ₁。在你的impl<'s> Render<'s>声明,你已经声明了 ρ₁ 是 's , 在你的 &'s mut self你已经声明 ρ₀ 是 's : 因此,借用 self 的生命周期's ,这意味着您只能借用一次,因为它会一直存在到类型被破坏之前——它已被声明为“至少与所引用的类型一样长”。

您想改变它,为 blit 引入一个新的生命周期参数。允许小于 's 的函数;你希望 ρ₀ 最小,只与返回值相关(因为我假设你实际上使用的是 's——如果不是,你应该忽略它并允许编译器推断我们将要显式编写的内容)。这样,借用只会在函数的返回值仍在范围内时处于事件状态(在您的简单示例中,它未被使用,因此您可以立即获取另一个引用)。

那么,这是对需要完成的函数的更改:

fn blit<'a>(&'a mut self) { }

如果您将其更改为具有返回值并使用它,则需要在调用 blit 之前确保它超出范围。再次。这可能意味着将它直接传递给一个函数,也可能意味着引入一个新的作用域,如下所示:

{
let foo = render.blit();
// … do things with foo … it then gets freed at the end of the block.
}
render.blit();

关于sfml - Rust (+SFML) - 如何在受生命周期参数限制时避免额外的对象构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24422139/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com