赋值要求 `'1` 必须比 `'a` 活得长

问题描述 投票:0回答:1

我正在创建一个具有两个字段的 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
rust borrow-checker
1个回答
0
投票

您不能拥有

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.