如何从闭包中传播错误? (Rust, winit crate 的事件循环)

How to propagate error out of a closure? (Rust, winit crate's event loop)

"this_function_returns_error" returns 结果,我需要将它传播回 main。 运行 函数的签名:https://docs.rs/winit/0.25.0/winit/event_loop/struct.EventLoop.html#method.run

我需要的简化示例:

use winit::{
    event::{Event, WindowEvent},
    event_loop::{ControlFlow, EventLoop},
    window::WindowBuilder,
};

fn main() -> Result<(), SomeError> {
    let event_loop = EventLoop::new();
    let window = WindowBuilder::new().build(&event_loop).unwrap();

    event_loop.run(move |event, _, control_flow| {
        *control_flow = ControlFlow::Wait;

        match event {
            Event::WindowEvent {
                event: WindowEvent::CloseRequested,
                window_id,
            } if window_id == window.id() => *control_flow = ControlFlow::Exit,
            _ => (),
        }
        this_function_returns_error()?;
    });
}

编译器指出:

闭包在运行方法中的位置:这个函数应该returnResultOption接受?

但我不确定我是否可以 return 这个闭包的结果,因为它是 winit 函数的参数。

I am not sure if I can even return the result from this closure as it is argument to winit's function.

不可以,事件循环处理程序的类型是:

FnMut(Event<'_, T>, &EventLoopWindowTarget<T>, &mut ControlFlow)

那里没有 return 值。

不仅如此,事件循环运行ner是这样打的:

pub fn run<F>(self, event_handler: F) -> !

-> ! 意味着 它永远不会 return

它将退出,但我认为它会直接终止当前进程[0],因为它的类型注释清楚地表明它永远不会放弃控制权 到封闭的 main.

[0] 事实上,这正是每个实现似乎都在做的事情:它们 运行 底层事件循环,如果它终止,它们就会进入 ::std::process::exit(0);.