Clippy lints / Pedantic
Clippy lint · Pedantic · checked with Clippy 0.1.99
clippy::explicit_deref_methods: explicit `deref` method call
What it meansChecks for explicit deref() or deref_mut() method calls. Doesn’t lint inside the implementation of the Deref or DerefMut traits. It is in the pedantic group and off by default.
What you see
warning: explicit `deref` method call --> main.rs:5:15 | 5 | let b: &str = a.deref(); | ^^^^^^^^^ help: try: `&*a` | = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#explicit_deref_methods = note: `-W clippy::explicit-deref-methods` implied by `-W clippy::pedantic`
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?
Dereferencing by &*x or &mut *x is clearer and more concise, when not part of a method chain.
Stricter lints with some false positives. Off by default; opt in with clippy::pedantic.
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
use std::ops::Deref;
let a: &mut String = &mut String::from("foo");
let b: &str = a.deref();
Write this instead
let a: &mut String = &mut String::from("foo");
let b = &*a;
Turn it off, or on
It is off by default. To use it, set it to warn or deny:
Whole crate (Cargo.toml)
[lints.clippy]
explicit_deref_methods = "warn"In code
#![warn(clippy::explicit_deref_methods)]One run
cargo clippy -- -W clippy::explicit-deref-methodsThe [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 explicit deref() or deref_mut() method calls.
Doesn’t lint inside the implementation of the Deref or DerefMut traits.
Why is this bad?
Dereferencing by &*x or &mut *x is clearer and more concise,
when not part of a method chain.
Example
use std::ops::Deref;
let a: &mut String = &mut String::from("foo");
let b: &str = a.deref();
Use instead:
let a: &mut String = &mut String::from("foo");
let b = &*a;
This lint excludes all of:
let _ = d.unwrap().deref();
let _ = Foo::deref(&foo);
let _ = <Foo as Deref>::deref(&foo);
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- too_many_linesChecks for functions with a large amount of lines
- missing_errors_docChecks the doc comments of publicly visible functions that return a Result type and warns if there is no # Errors section
- must_use_candidateChecks for public functions that have no #[must_use] attribute, but return something not already marked must-use, have no mutable arg and mutate no statics
- elidable_lifetime_namesChecks for lifetime annotations which can be replaced with anonymous lifetimes ('_)
- enum_glob_useChecks for use Enum::*
- expl_impl_clone_on_copyChecks for explicit Clone implementations for Copy types
- explicit_into_iter_loopChecks for loops on y.into_iter() where y will do, and suggests the latter
- explicit_iter_loopChecks for loops on x.iter() where &x will do, and suggests the latter
- filter_map_nextcalled `filter_map(..).next()` on an `Iterator`
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::too_many_linesChecks for functions with a large amount of linesRead it next →Did this answer your question?