Summary
clippy::manual_unwrap_or_default fails to consider deref type coercion for the returned values
Lint Name
manual_unwrap_or_default
Reproducer
Playground: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=b8497c471fa7991f62cb1ef29fe18e31
fn foo(s: &Option<String>) -> &str {
if let Some(s) = s {
s
} else {
""
}
}
fn bar(s: Option<&String>) -> &str {
if let Some(s) = s {
s
} else {
""
}
}
Clippy suggests the code s.unwrap_or_default() and then rust suggests &s.unwrap_or_default(), which naturally will not work due to returning a reference to a temporary local value.
A way to simplify foo would be to use as_deref() first:
s.as_deref().unwrap_or_default()
A way to simplify bar would be to deref the inner value using map first:
s.map(std::ops::Deref::deref).unwrap_or_default()
// or
s.map(|s| &**s).unwrap_or_default()
Version
Playground:
Nightly channel
Build using the Nightly version: 1.79.0-nightly
(2024-04-08 ab5bda1aa70f707014e2)
Local:
rustc 1.79.0-nightly (8b2459c1f 2024-04-09)
binary: rustc
commit-hash: 8b2459c1f21187f9792d99310171a15e64feb9cf
commit-date: 2024-04-09
host: x86_64-apple-darwin
release: 1.79.0-nightly
LLVM version: 18.1.3
Additional Labels
No response
Summary
clippy::manual_unwrap_or_defaultfails to consider deref type coercion for the returned valuesLint Name
manual_unwrap_or_default
Reproducer
Playground: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=b8497c471fa7991f62cb1ef29fe18e31
Clippy suggests the code
s.unwrap_or_default()and then rust suggests&s.unwrap_or_default(), which naturally will not work due to returning a reference to a temporary local value.A way to simplify
foowould be to useas_deref()first:A way to simplify
barwould be to deref the inner value usingmapfirst:Version
Additional Labels
No response