Clippy lints / Complexity
Clippy lint · Complexity · checked with Clippy 0.1.99
clippy::needless_question_mark: Suggests replacing Ok(x?) or Some(x?) with x in return positions where the ? operator is not needed to convert the type of x
What it meansSuggests replacing Ok(x?) or Some(x?) with x in return positions where the ? operator is not needed to convert the type of x. It is in the complexity group and warns by default.
Does it matter?
There’s no reason to use ? to short-circuit when execution of the body will end there anyway.
Code that does something simple in a complicated way. 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
fn f(s: &str) -> Option<usize> {
Some(s.find('x')?)
}
fn g(s: &str) -> Result<usize, ParseIntError> {
Ok(s.parse()?)
}
Write this instead
fn f(s: &str) -> Option<usize> {
s.find('x')
}
fn g(s: &str) -> Result<usize, ParseIntError> {
s.parse()
}
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::needless_question_mark)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
needless_question_mark = "allow"One run
cargo clippy -- -A clippy::needless-question-markThe [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
Suggests replacing Ok(x?) or Some(x?) with x in return positions where the ? operator
is not needed to convert the type of x.
Why is this bad?
There’s no reason to use ? to short-circuit when execution of the body will end there anyway.
Example
fn f(s: &str) -> Option<usize> {
Some(s.find('x')?)
}
fn g(s: &str) -> Result<usize, ParseIntError> {
Ok(s.parse()?)
}
Use instead:
fn f(s: &str) -> Option<usize> {
s.find('x')
}
fn g(s: &str) -> Result<usize, ParseIntError> {
s.parse()
}
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- too_many_argumentsChecks for functions with too many parameters
- clone_on_copyusing `clone` on type `u64` which implements the `Copy` trait
- type_complexityChecks for types used in structs, parameters and let declarations above a certain complexity threshold
- needless_matchChecks for unnecessary match or match-like if let returns for Option and Result when function signatures are the same
- needless_option_as_derefderefed type is same as origin
- needless_option_takecalled `Option::take()` on a temporary value
- needless_splitnunnecessary use of `splitn`
- needless_updateChecks for needlessly including a base struct on update when all fields are changed anyway. This lint is not applied to structs marked with non_exhaustive
- neg_cmp_op_on_partial_ordthe use of negated comparison operators on partially ordered types produces code that is hard to read and refactor, please consider using the `partial_cmp` method instead, to make it clear that the two values could be incomparable
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::too_many_argumentsChecks for functions with too many parametersRead it next →Did this answer your question?