0

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

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

更可取的选择是将 与一起保留Sprite<'s>在 my中。由于'Sprite'有一个生命周期参数,它变成:struct RenderTexturestruct 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) -> () { }
}

(如果问题不清楚,请道歉。当我对这些概念不太熟悉时,很难表达。)

4

1 回答 1

2

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

你想改变它来为允许小于的函数引入一个的生命周期参数;您希望 ρ₀ 最小,仅与返回值相关(我假设您实际上正在使用- 如果不是,您应该忽略它并允许编译器显式推断我们将要编写的内容)。这样,借用只会在函数的返回值仍在范围内时才有效(在您的简单示例中,它没有被使用,因此您可以立即获取另一个引用)。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();
于 2014-06-26T06:01:37.280 回答