【发布时间】:2014-06-26 03:57:52
【问题描述】:
我目前正在使用rust-sfml (rsfml::graphics) 在屏幕上绘制像素。 (我只是从 Rust 和项目开始。)我将数据存储在 Image,然后复制到 Texture。
这个Texture用来创建一个Sprite<'s>;这就是我的问题。我需要能够改变Texture,但Sprite<'s> 的类型似乎保证我不能做我想做的事。因为每次重绘窗口时我都需要能够调用window.draw(&sprite),所以我每次都创建一个新的Sprite。
更好的选择是将Sprite<'s> 与Texture 一起保留在我的struct Render 中。由于'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 实例的生命周期(整个 main 函数)。
我怎样才能保留我原来的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) -> () { }
}
(如果问题不清楚,请见谅。当我对概念不是很熟悉时,很难表达。)
【问题讨论】:
-
这没有意义——如果你的代码真的是只是
render.blit(); render.blit();,那么要么两者都不起作用,要么两者都起作用。你能发布更完整的代码吗? -
谢谢,克里斯。我做了一个半最小的例子,并附在最后。
-
仅供参考,
-> ()部分是多余的,'s在您的blit调用中也是如此。 -
Eww...在您的
blit定义中使用's是导致它的原因。它使借款持续时间更长。当然,现在我看到了…… -
好吧,当我有实际代码使用
sprite时,就需要 blit 定义中的's(我认为...)。
标签: sfml rust lifetime lifetime-scoping