rust - Restrict lifetime parameter to scope of parameters of a function -
consider following example
trait mytrait<'a> { type n: 'a; fn func(&'a self) -> self::n; } fn myfunc<'a,t: 'a + mytrait<'a>>(g: t) { g.func(); } fn main() { }
compiling small program fails with:
test.rs:25:5: 25:6 error: `g` not live long enough test.rs:25 g.func(); ^ test.rs:24:41: 26:2 note: reference must valid lifetime 'a defined on block @ 24:40... test.rs:24 fn myfunc<'a,t: 'a + mytrait<'a>>(g: t) { test.rs:25 g.func(); test.rs:26 } test.rs:24:41: 26:2 note: ...but borrowed value valid scope of parameters function @ 24:40 test.rs:24 fn myfunc<'a,t: 'a + mytrait<'a>>(g: t) { test.rs:25 g.func(); test.rs:26 }
as far understand, lifetime parameter 'a
not restricted , arbitrary. however, g
parameter , lifetime function scope. therefore not satisfy condition of lifetime 'a
in definition of method func
.
what want associated type n
restricted lifetime of self
in mytrait
. that's why came explicit lifetime parameter 'a
of mytrait
. , want function myfunc
work, i.e. 'a
should somehow restricted lifetime of of parameter g
.
what "correct" way solve problem?
a simple example is
struct myptr<'a> { x: &'a usize } struct mystruct { data: vec<usize> } impl<'a> mytrait<'a> mystruct { type n = myptr<'a>; fn func(&'a self) -> self::n { myptr{x: &self.data[0]} } }
note extremely simplified, of course. idea n
contains reference contained in mytrait
, should therefore never outlive mytrait
.
what want not bind generic lifetime, allow "any" lifetime:
fn myfunc<t: for<'a> mytrait<'a>>(g: t) { g.func(); }
fully working example in playground
Comments
Post a Comment