Clippy lints / Performance
Clippy lint · Performance · checked with Clippy 0.1.99
clippy::expect_fun_call: Checks for calls to .expect(&format!(...)), .expect(foo(..)), etc., and suggests to use unwrap_or_else instead
What it meansChecks for calls to .expect(&format!(...)), .expect(foo(..)), etc., and suggests to use unwrap_or_else instead It is in the performance group and warns by default.
Does it matter?
The function will always be called.
Code that could be written to run faster. 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
foo.expect(&format!("Err {}: {}", err_code, err_msg));
// or
foo.expect(format!("Err {}: {}", err_code, err_msg).as_str());
Write this instead
foo.unwrap_or_else(|| panic!("Err {}: {}", err_code, err_msg));
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::expect_fun_call)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
expect_fun_call = "allow"One run
cargo clippy -- -A clippy::expect-fun-callThe [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 for calls to .expect(&format!(...)), .expect(foo(..)),
etc., and suggests to use unwrap_or_else instead
Why is this bad?
The function will always be called.
Known problems
If the function has side-effects, not calling it will change the semantics of the program, but you shouldn’t rely on that anyway.
Example
foo.expect(&format!("Err {}: {}", err_code, err_msg));
// or
foo.expect(format!("Err {}: {}", err_code, err_msg).as_str());
Use instead:
foo.unwrap_or_else(|| panic!("Err {}: {}", err_code, err_msg));
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- large_enum_variantlarge size difference between variants
- collapsible_str_replaceChecks for consecutive calls to str::replace (2 or more) that can be collapsed into a single call
- double_ended_iterator_lastcalled `Iterator::last` on a `DoubleEndedIterator`; this will needlessly iterate the entire iterator
- drain_collectdraining all elements of a collection into a new collection of the same type
- extend_with_drainuse of `extend` instead of `append` for adding the full range of a second vector
- format_in_format_argsDetects format! within the arguments of another macro that does formatting such as format! itself, write! or println!
- iter_overeager_clonedChecks for usage of _.cloned().<func>() where call to .cloned() can be postponed
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::large_enum_variantlarge size difference between variantsRead it next →Did this answer your question?