Rust (+SFML) - How to avoid extra object construction when limited by lifetime parameters? -
i'm using rust-sfml
(rsfml::graphics
) to, @ moment, draw pixels screen. (i'm starting both rust , project.) i'm storing data in image
, copying texture
.
this texture
used create sprite<'s>
; herein lies problem. need able mutate texture
, type of sprite<'s>
seems guarantee can't want. since need able call window.draw(&sprite)
every time window redrawn, i'm creating new sprite
each time.
the preferable alternative keep sprite<'s>
in struct render
along texture
. since 'sprite' has lifetime parameter, becomes struct render<'s>
:
struct render<'s> { texture: texture, sprite: sprite<'s>, }
i have method on render
:
fn blit(&'s mut self) -> ()
which mutates render
(by editing texture
). now, try call blit
more once, run problem:
render.blit(); render.blit(); // error: cannot borrow `render` mutable more once @ time
which, think, happens because lifetime parameter forces the render
's lifetime-as-borrowed-by-the-first-blit
-call equal lifetime of render
instance (the whole main function).
how can keep original sprite
, continue able mutate container? possible?
here stupid-looking , minimal example:
extern crate rsfml; use rsfml::graphics::sprite; fn main() -> () { let mut render = render::new(); render.blit(); render.blit(); // error: cannot borrow `render` mutable more once @ time } struct render<'s> { sprite: option<sprite<'s>>, } impl<'s> render<'s> { fn new() -> render { render { sprite: none } } fn blit(&'s mut self) -> () { } }
(apologies if question not clear. it's difficult express when i'm not familiar concepts.)
when call blit
, there 2 lifetimes under consideration; self
, see, of type &'ρ₀ render<'ρ₁>
lifetimes ρ₀ , ρ₁. in impl<'s> render<'s>
declaration, have declared ρ₁ 's
, , in &'s mut self
have declared ρ₀ 's
: thus, lifetime of borrow of self
is 's
, means can ever have 1 borrow survive until destruction of type—it has been declared “at least long type being referred to”.
you want alter introduce new lifetime parameter blit
function permitted less 's
; wish ρ₀ minimal, tied return value (as presume using 's
—if not, should omit , allow compiler infer we’re write explicitly). way, borrow active while return value of function still in scope (in trivial example, it’s not used , can take reference).
this, then, alteration function needs done:
fn blit<'a>(&'a mut self) { }
if alter have return value , use it, you’ll need make sure out of scope before call blit
again. may mean passing directly function, or may mean introducing new scope, this:
{ let foo = render.blit(); // … things foo … gets freed @ end of block. } render.blit();
Comments
Post a Comment