如何从闭包中传播错误? (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()?;
});
}
编译器指出:
闭包在运行方法中的位置:这个函数应该returnResult
或Option
接受?
但我不确定我是否可以 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);
.
"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()?;
});
}
编译器指出:
闭包在运行方法中的位置:这个函数应该returnResult
或Option
接受?
但我不确定我是否可以 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);
.