簡體   English   中英

由於需求沖突,無法推斷出合適的生命周期

[英]Cannot infer an appropriate lifetime due to conflicting requirements

我是 Rust 的新手,我正在使用 rust-tui 構建一個 TUI 應用程序來練習和理解 Rust 的概念。 我有這個代碼:

// the widgets that can be renderd on the screen
#[derive(Clone)]
pub enum Widgets<'a> {
    ResList(ResList<'a>),
    ListResults(ListResults<'a>),
    Input(Input),
}

pub struct Screen<'a> {
    renders_done: u32,
    tx: Sender<Result<Event, crossterm::ErrorKind>>,
    rx: Receiver<Result<Event, crossterm::ErrorKind>>,
    main_screen: Widgets<'a>,
}


impl Screen<'_> {

    pub async fn handle_events(&mut self) {
        let event = self
            .rx
            .recv()
            .expect("Err while recievent the events in the reciever")
            .unwrap();

        let new_screen: Option<Widgets> = match &mut self.main_screen {
            Widgets::ResList(res_list) => {
                match event {
                    Event::Key(event) => match event.code {
                        KeyCode::Esc => {
                            Screen::exit_app();
                            None
                        }
                    _ => None,
                }
            }
            Widgets::Input(input) => input.handle_events(event).await,  <-- the problem comes when I add this
            _ => None,
        };
        match new_screen {
            Some(screen) => self.main_screen = screen,
            None => {}
        }
    }

}
impl Input {
    async fn handle_events(&mut self, event: Event) -> Option<Widgets> {
       None
    }
}

這個想法是,如果子模塊返回一個小部件,主屏幕應該更改為該新小部件。 現在出於發短信的目的,我從不返回小部件。 但是當我嘗試構建代碼時,編譯器會抱怨:

error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
   --> src/model/tui/screen.rs:84:32
    |
84  |     pub async fn handle_events(&mut self) {
    |                                ^^^^^^^^^
    |
note: first, the lifetime cannot outlive the lifetime `'_` as defined on the method body at 84:32...
   --> src/model/tui/screen.rs:84:32
    |
84  |     pub async fn handle_events(&mut self) {
    |                                ^
note: ...so that the expression is assignable
   --> src/model/tui/screen.rs:84:32
    |
84  |     pub async fn handle_events(&mut self) {
    |                                ^^^^^^^^^
    = note: expected `&mut Screen<'_>`
               found `&mut Screen<'_>`
note: but, the lifetime must be valid for the lifetime `'_` as defined on the impl at 45:13...
   --> src/model/tui/screen.rs:45:13
    |
45  | impl Screen<'_> {
    |             ^^
note: ...so that the expression is assignable
   --> src/model/tui/screen.rs:126:52
    |
126 |             Some(mut screen) => self.main_screen = screen,
    |                                                    ^^^^^^
    = note: expected `Widgets<'_>`
               found `Widgets<'_>`

error: aborting due to previous error; 8 warnings emitted

For more information about this error, try `rustc --explain E0495`.

據我所知,生命周期不足以保存在結構中,但我沒有在任何地方使用引用,它們都是擁有的值。 有人可以幫助我了解我錯過了什么嗎?

在返回的小部件上明確指定生命周期並創建對象的明確生命周期:

impl<'screen> Screen<'screen> {

    pub async fn handle_events<'c>(&'cmut self) {
        let event = self
            .rx
            .recv()
            .expect("Err while recievent the events in the reciever")
            .unwrap();

        let new_screen: Option<Widgets<'screen>> = match &mut self.main_screen {
            Widgets::ResList(res_list) => {
                match event {
                    Event::Key(event) => match event.code {
                        KeyCode::Esc => {
                            Screen::exit_app();
                            None
                        }
                    _ => None,
                }
            }
            Widgets::Input(input) => input.handle_events(event).await,
            _ => None,
        };
        match new_screen {
            Some(screen) => self.main_screen = screen,
            None => {}
        }
    }

}

從函數內部返回 Widget 時,還要顯式添加生命周期

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM