error[E0515]: cannot return value referencing local variable `ver` --> src/main.rs:26:9 | 25 | letlogger = Logger::new(&ver); | ---- `ver` is borrowed here 26 | Self { ver, logger } | ^^^^^^^^^^^^^^^^^^^^ returns a value referencing data owned by the current function
error[E0505]: cannot move out of `ver` because it is borrowed --> src/main.rs:26:16 | 22 | impl<'a> Application<'a> { | -- lifetime `'a` defined here 23 | pubfnnew() ->Self { 24 | letver = Version::new(); | --- binding `ver` declared here 25 | letlogger = Logger::new(&ver); | ---- borrow of `ver` occurs here 26 | Self { ver, logger } | -------^^^---------- | | | | | move out of `ver` occurs here | returning this value requires that `ver` is borrowed for `'a`
很显然version的生命周期和结构体一致,而Logger中&ver的生命周期是’a,超过了结构体的生命周期。解决方案可以将 version 的所有权移出结构体:
#[borrows(ver)] #[covariant] logger: Logger<'this>, } // wrapper so we can define our own "new" function, using // the ouroboros-generated one internally structApplication(ApplicationFields);
implApplication { fnnew() ->Self { Self( // let's use the more fancy …Builder API instead of // `ApplicationFields::new` (both are essentially equivalent though) ApplicationFieldsBuilder { ver: Version::new(), logger_builder: |version| Logger::new(version), } .build(), ) } }