Returning object containing references in Rust -
i have following 2 types:
struct { x: int } struct b<'a> { y: &'a } i create function creates object of type , object of type b containing reference object of type a, , returns object of type b:
fn bar<'a>() -> b<'a> { let y = { x: 3 }; b { y: &y } } however following compiler error:
main.rs:11:13: 11:14 error: `y` not live long enough main.rs:11 b { y: &y } ^ main.rs:9:23: 12:2 note: reference must valid lifetime 'a defined on block @ 9:22... main.rs:9 fn bar<'a>() -> b<'a> { main.rs:10 let y = { x: 3 }; main.rs:11 b { y: &y } main.rs:12 } main.rs:9:23: 12:2 note: ...but borrowed value valid block @ 9:22 main.rs:9 fn bar<'a>() -> b<'a> { main.rs:10 let y = { x: 3 }; main.rs:11 b { y: &y } main.rs:12 } error: aborting due previous error this error seems justified, can't find way around issue. there way specify lifetime of y should @ least 'a, without changing definition of a or b?
there no way specify y lifetime should @ least 'a because impossible: y local variable , cannot live longer stack frame created in.
in general, if find need such thing, in fact want b own a:
struct b { y: } in case code becomes trivial:
fn bar() -> b { let y = { x: 3 } b { y: y } } you can point. signature of bar() want:
fn bar<'b>() -> b<'b> { ... } 'b lifetime parameter, is, can chosen arbitrarily caller of function. nothing prevents caller substitute, example, 'static 'b:
let x: b<'static> = bar(); however, possible if bar() always return b<'static>, not want, seems. in fact, above signature equivalent one:
fn bar() -> b<'static> { ... }
Comments
Post a Comment