if let Syntax
if let is a shortcut for handling just one interesting case of a value, without writing out every possibility.if let Pattern(binding) = value {
// body
} else {
// no match
}
Basic if let
if let matches a value against a single pattern and runs its block only if that pattern matches, skipping the block entirely otherwise. It's a shorthand for a match that only cares about one case.
Example: Basic if let
// Entry point: execution of the program starts here
fn main() {
// Declare an immutable variable `config_max` (a `Option<u8>`), set to `Some(3)`
let config_max: Option<u8> = Some(3);
// If `config_max` matches `Some(max)`, bind and run this block
if let Some(max) = config_max {
// Print "Maximum is configured to be {}" to the console, substituting in `max` (with a trailing newline)
println!("Maximum is configured to be {}", max);
}
}
Login to try C/C++/Java/PHP code in the editor
if let With else
Adding an else block to if let lets you handle the non-matching case as well, giving you full coverage with less boilerplate than a match when there is only one interesting variant.
Example: if let With else
// Entry point: execution of the program starts here
fn main() {
// Declare an immutable variable `value` (a `Option<i32>`), set to `None`
let value: Option<i32> = None;
// If `value` matches `Some(v)`, bind and run this block
if let Some(v) = value {
// Print "Got value: {}" to the console, substituting in `v` (with a trailing newline)
println!("Got value: {}", v);
// Otherwise, run this branch
} else {
// Print "No value present" to the console (with a trailing newline)
println!("No value present");
}
}
Login to try C/C++/Java/PHP code in the editor
if let With an Enum
if let works with any enum, not just Option, letting you handle a single variant of interest concisely while ignoring the rest.
Example: if let With an Enum
// Define an enum `Shape` listing its possible variants
enum Shape {
Circle(f64),
Square(f64),
}
// Entry point: execution of the program starts here
fn main() {
// Declare an immutable variable `shape`, set to `Shape::Circle(3.0)`
let shape = Shape::Circle(3.0);
// If `shape` matches `Shape::Circle(radius)`, bind and run this block
if let Shape::Circle(radius) = shape {
// Print "Circle with radius {}" to the console, substituting in `radius` (with a trailing newline)
println!("Circle with radius {}", radius);
}
}
Login to try C/C++/Java/PHP code in the editor
Choosing if let vs match
if let is best when you only care about one specific pattern and want to ignore everything else concisely; match is better when you need to handle every possible case explicitly.
Example: Choosing if let vs match
// Entry point: execution of the program starts here
fn main() {
// Declare an immutable variable `items`, set to `[Some(1), None, Some(3)]`
let items = [Some(1), None, Some(3)];
// Loop over `items.iter()`, binding each item to `item`
for item in items.iter() {
// If `item` matches `Some(n)`, bind and run this block
if let Some(n) = item {
// Print "Found: {}" to the console, substituting in `n` (with a trailing newline)
println!("Found: {}", n);
}
}
}
Login to try C/C++/Java/PHP code in the editor
- Using a full
matchwith a wildcard_ => {}arm when a much shorterif letwould express the same logic. - Forgetting
if letis non-exhaustive by design -- it deliberately ignores every case that doesn't match the given pattern. - Not realizing
if let ... elsecan handle the non-matching case too, combining the concise syntax with full coverage.
if let pattern = value { ... }runs the block only whenvaluematches the given pattern.if letis useful when only one variant of amatchactually matters, avoiding boilerplate for the rest.- An
elsebranch can be attached toif letto handle every other case in one place. - Unlike
match,if letdoes not need to be exhaustive.
Chapter Quiz — Complete all 7 topics to unlock
0/7 topics done
Complete these topics first: