繁体   English   中英

Rust 通过闭包和它们的生命周期

[英]Rust passing closures and they lifetime

嗨,我尝试通过以下方式将我的关闭传递给返回function的模拟板条箱:

pub fn set_dialog_game_selection(dialogs: &mut Box<MockAsk>, steam_id: String) {
    dialogs
        .expect_ask_for_game_decision_if_needed_and_set_game_to_launch()
        .returning(ask_for_game_decision_if_needed_return_mock(steam_id));
}

pub fn ask_for_game_decision_if_needed_return_mock<'x, 'y>(
    steam_id: String,
) -> Box<dyn Fn(&'x mut REvilConfig, &'y mut REvilManagerState) -> ResultDialogsErr<()> + Send> {
    let default = move |_: &'x mut REvilConfig, state: &'y mut REvilManagerState| {
        state.selected_game_to_launch = Some(steam_id.clone());
        Ok(())
    };
    return Box::new(default);
}

但我明白了

error[E0308]: mismatched types
   --> src\tests\integration.rs:128:14
    |
128 |             .returning(ask_for_game_decision_if_needed_return_mock(steam_id.to_string()));
    |              ^^^^^^^^^ lifetime mismatch
    |
    = note: expected associated type `<dyn Fn(&mut configStruct::REvilConfig, &mut rManager_header::REvilManagerState) -> Result<(), error_stack::Report<DialogsErrors>> + Send as FnOnce<(&mut configStruct::REvilConfig, &mut rManager_header::REvilManagerState)>>::Output`
               found associated type `<dyn Fn(&mut configStruct::REvilConfig, &mut rManager_header::REvilManagerState) -> Result<(), error_stack::Report<DialogsErrors>> + Send as FnOnce<(&mut configStruct::REvilConfig, &mut rManager_header::REvilManagerState)>>::Output`
note: the lifetime requirement is introduced here
   --> src\dialogs\dialogs.rs:54:10
    |
54  |     ) -> ResultDialogsErr<()>;
    |          ^^^^^^^^^^^^^^^^^^^^

PS我正在为《生化危机》游戏编写模组管理器,这就是“REvil”的原因:p

P.S2 最后我设法将其重写为:

pub fn set_dialog_game_selection(dialogs: &mut Box<MockAsk>, steam_id: String) {
    dialogs
        .expect_ask_for_game_decision_if_needed_and_set_game_to_launch()
        .returning(move |_, state| {
            set_game_decision(steam_id.clone(), state);
            Ok(())
        });
}

pub fn set_game_decision(steam_id: String, state: &mut REvilManagerState) {
    state.selected_game_to_launch = Some(steam_id);
}

但是为什么我的第一种方法不起作用?:(

我试图模拟的 Function 签名如下:

pub type ResultDialogsErr<T> = Result<T, DialogsErrors>;

fn ask_for_game_decision_if_needed_and_set_game_to_launch(
   &mut self,
   config: &mut REvilConfig,
   state: &mut REvilManagerState,
) -> ResultDialogsErr<()>;

如果您删除手动生命周期注释,它会起作用:

pub fn ask_for_game_decision_if_needed_return_mock(
    steam_id: String,
) -> Box<dyn Fn(&mut REvilConfig, &mut REvilManagerState) -> DynResult<()> + Send> {
    let default = move |_: &mut REvilConfig, state: &mut REvilManagerState| {
        state.selected_game_to_launch = Some(steam_id.clone());
        Ok(())
    };
    return Box::new(default);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM