I encountered this snippet in some example code. It works fine, but I got a linter error saying that it should be structured as an if-let statement.
match event
Directly quoting from The Book, second edition:
The
if let
syntax lets you combineif
andlet
into a less verbose way to handle values that match one pattern and ignore the rest.
It also provides this example:
if let Some(3) = some_u8_value {
println!("three");
}
The correct syntax is if let «pattern» = «expression» { ... }
, and not the opposite written in the question.
if let glutin::Event::WindowEvent { event, .. } = event {
// ...
}
The syntax that eludes you is called destructuring.
This pattern allows to match certain fields in a struct, enum, or tuple. You therefore cannot just use if let with the destructuring on the right side of the binding.
The code you want is probably:
if let glutin::Event::WindowEvent { event, .. } = event {
match event {
glutin::WindowEvent::Closed => return glutin::ControlFlow::Break,
glutin::WindowEvent::Resized(w, h) => gl_window.resize(w, h),
_ => (),
}
}
There is a possible confusion between the right hand event
variable and the one extracted from the pattern.
The use of event
in the destructuring is made mandatory because it needs to use struct fields by name.