Clippy lints / Suspicious
Clippy lint · Suspicious · checked with Clippy 0.1.99
clippy::manual_unwrap_or_default: match can be simplified with `.unwrap_or_default()`
What it meansChecks if a match or if let expression can be simplified using .unwrap_or_default(). It is in the suspicious group and warns by default.
What you see
warning: match can be simplified with `.unwrap_or_default()` --> main.rs:4:17 | 4 | let y: String = match x { | _________________^ 5 | | Some(v) => v, 6 | | None => String::new(), 7 | | }; | |_^ help: replace it with: `x.unwrap_or_default()` | = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#manual_unwrap_or_default = note: `#[warn(clippy::manual_unwrap_or_default)]` on by default
Real output of Clippy 0.1.99 (Rust 1.99) on the example below. Names and line numbers in yours will differ.
Does it matter?
It can be done in one call with .unwrap_or_default().
Code that is most likely wrong or useless. Warns by default.
How to fix it
Clippy can fix this one for you: run cargo clippy --fix (add --allow-dirty if you have uncommitted changes). Review the diff before you commit.
Flagged
let x: Option<String> = Some(String::new());
let y: String = match x {
Some(v) => v,
None => String::new(),
};
let x: Option<Vec<String>> = Some(Vec::new());
let y: Vec<String> = if let Some(v) = x {
v
} else {
Vec::new()
};
Write this instead
let x: Option<String> = Some(String::new());
let y: String = x.unwrap_or_default();
let x: Option<Vec<String>> = Some(Vec::new());
let y: Vec<String> = x.unwrap_or_default();
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::manual_unwrap_or_default)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
manual_unwrap_or_default = "allow"One run
cargo clippy -- -A clippy::manual-unwrap-or-defaultThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
Checks if a match or if let expression can be simplified using
.unwrap_or_default().
Why is this bad?
It can be done in one call with .unwrap_or_default().
Example
let x: Option<String> = Some(String::new());
let y: String = match x {
Some(v) => v,
None => String::new(),
};
let x: Option<Vec<String>> = Some(Vec::new());
let y: Vec<String> = if let Some(v) = x {
v
} else {
Vec::new()
};
Use instead:
let x: Option<String> = Some(String::new());
let y: String = x.unwrap_or_default();
let x: Option<Vec<String>> = Some(Vec::new());
let y: Vec<String> = x.unwrap_or_default();
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- let_underscore_futurenon-binding `let` on a future
- lines_filter_map_okChecks for usage of lines.filter_map(Result::ok) or lines.flat_map(Result::ok) when lines has type std::io::Lines
- macro_metavars_in_unsafeLooks for macros that expand metavariables in an unsafe block
- mismatched_bit_width_typepossible buggy implementation of `bit_width`
- misnamed_gettersgetter function appears to return the wrong field
- misrefactored_assign_opvariable appears on both sides of an assignment operation
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::let_underscore_futurenon-binding `let` on a futureRead it next →Did this answer your question?