微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

"this_function_returns_error" 返回 Result,我需要将它传播回 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()?;
    });
}

编译器指出:

run 方法中的闭包位置:这个函数应该返回 ResultOption 来接受 ?

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

解决方法

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

不,你不能,事件循环处理程序的类型是:

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

里面没有返回值。

不仅如此,还输入了事件循环运行器:

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

-> ! 表示它永远不会返回

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

[0] 确实,这正是每个实现似乎所做的:它们运行底层事件循环,如果它终止,它们就转到 ::std::process::exit(0);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。