我正在创建一个具有两个字段的 struct App:一个字段包含一个拥有的
window
(此处简化为 u32
),另一个字段包含一个最终应引用上面窗口的结构。但是,当我尝试在 resumed
方法中填充结构时,编译器无法保证 self('1 的生命周期)将比窗口引用 'a 的寿命长。对我来说,这是非常明显的,因为 '1
将拥有窗口,因此引用具有相同的生命周期 '1
..可以这么说,但如何告诉编译器?我对 Rust 很陌生,所以我很高兴得到一个不太技术性的答案:)
现场演示:
struct State<'a> {
window: &'a u32
}
impl<'a> State<'a> {
fn new(window: &'a u32) -> Self {
State{
window
}
}
}
#[derive(Default)]
struct App<'a> {
window: u32,
state: Option<State<'a>>,
}
trait ApplicationHandler
{
fn resumed(&mut self);
}
impl<'a> ApplicationHandler for App<'a> {
fn resumed(&mut self) {
self.window = 21;
self.state = Some(State::new(&self.window))
}
}
fn main() {
let mut app = App::default();
app.resumed();
}
这是我得到的错误:
error: lifetime may not live long enough
--> <source>:31:9
|
27 | impl<'a> ApplicationHandler for App<'a> {
| -- lifetime `'a` defined here
28 |
29 | fn resumed(&mut self) {
| - let's call the lifetime of this reference `'1`
30 | self.window = 21;
31 | self.state = Some(State::new(&self.window))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment requires that `'1` must outlive `'a`
error: aborting due to 1 previous error
您不能拥有
App
的其中一个字段 state
,借用另一个字段 window
。例如,如果 App
被 memcopy
发送到不同的地址,例如let app2 = app;
,state
的window
参考不会更新。
在您的具体情况下,我建议重构您的代码,以消除对状态中的
window
引用的需要。您从未在现场演示中实际使用过它,因此很难知道您的想法。但是,请考虑使其像这样工作:
// No more lifetime required.
struct State {
some: u8,
actual: String,
state: f32,
}
// No more lifetime required.
#[derive(Default)]
struct App {
window: u32,
state: State,
}
impl State {
// Take the window reference as a parameter.
fn do_something(&mut self, window: &Window) {
...
}
}
impl App {
fn action(&mut self) {
// Pass a reference to the window field.
self.state.do_something(&self.window);
}
}