Clippy lints / Complexity
Clippy lint · Complexity · checked with Clippy 0.1.99
clippy::match_as_ref: manual implementation of `Option::as_ref`
What it meansChecks for match which is used to add a reference to an Option value. It is in the complexity group and warns by default.
What you see
warning: manual implementation of `Option::as_ref` --> main.rs:5:22 | 5 | let r: Option<&()> = match x { | ______________________^ 6 | | None => None, 7 | | Some(ref v) => Some(v), 8 | | }; | |_^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#match_as_ref = note: `#[warn(clippy::match_as_ref)]` on by default help: use `Option::as_ref()` directly | 5 - let r: Option<&()> = match x { 6 - None => None, 7 - Some(ref v) => Some(v), 8 - }; 5 + let r: Option<&()> = x.as_ref(); |
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?
Using as_ref() or as_mut() instead is shorter.
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
let x: Option<()> = None;
let r: Option<&()> = match x {
None => None,
Some(ref v) => Some(v),
};
Write this instead
let x: Option<()> = None;
let r: Option<&()> = x.as_ref();
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::match_as_ref)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
match_as_ref = "allow"One run
cargo clippy -- -A clippy::match-as-refThe [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 match which is used to add a reference to an
Option value.
Why is this bad?
Using as_ref() or as_mut() instead is shorter.
Example
let x: Option<()> = None;
let r: Option<&()> = match x {
None => None,
Some(ref v) => Some(v),
};
Use instead:
let x: Option<()> = None;
let r: Option<&()> = x.as_ref();
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
- map_flattencalled `map(..).flatten()` on `Iterator`
- map_identityunnecessary map of the identity function
- map_or_identityexpression can be simplified using `Option::unwrap_or()`
- match_single_bindingChecks for useless match that binds to only one value
- needless_arbitrary_self_typethe type of the `self` parameter does not need to be arbitrary
- needless_as_bytesneedless call to `as_bytes`
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?