Clippy lints / Performance
Clippy lint · Performance · checked with Clippy 0.1.99
clippy::double_ended_iterator_last: called `Iterator::last` on a `DoubleEndedIterator`; this will needlessly iterate the entire iterator
What it meansChecks for Iterator::last being called on a DoubleEndedIterator, which can be replaced with DoubleEndedIterator::next_back. It is in the performance group and warns by default.
What you see
warning: called `Iterator::last` on a `DoubleEndedIterator`; this will needlessly iterate the entire iterator --> main.rs:3:16 | 3 | let last_arg = "echo hello world".split(' ').last(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#double_ended_iterator_last = note: `#[warn(clippy::double_ended_iterator_last)]` on by default help: try | 3 - let last_arg = "echo hello world".split(' ').last(); 3 + let last_arg = "echo hello world".split(' ').next_back(); |
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?
Iterator::last is implemented by consuming the iterator, which is unnecessary if the iterator is a DoubleEndedIterator. Since Rust traits do not allow specialization, Iterator::last cannot be optimized for DoubleEndedIterator.
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
let last_arg = "echo hello world".split(' ').last();
Write this instead
let last_arg = "echo hello world".split(' ').next_back();
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::double_ended_iterator_last)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
double_ended_iterator_last = "allow"One run
cargo clippy -- -A clippy::double-ended-iterator-lastThe [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 Iterator::last being called on a DoubleEndedIterator, which can be replaced
with DoubleEndedIterator::next_back.
Why is this bad?
Iterator::last is implemented by consuming the iterator, which is unnecessary if
the iterator is a DoubleEndedIterator. Since Rust traits do not allow specialization,
Iterator::last cannot be optimized for DoubleEndedIterator.
Example
let last_arg = "echo hello world".split(' ').last();
Use instead:
let last_arg = "echo hello world".split(' ').next_back();
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
- cloned_ref_to_slice_refsChecks for slice references with cloned references such as &[f.clone()]
- cmp_ownedChecks for conversions to owned values just for the sake of a comparison
- collapsible_str_replaceChecks for consecutive calls to str::replace (2 or more) that can be collapsed into a single call
- drain_collectdraining all elements of a collection into a new collection of the same type
- expect_fun_callChecks for calls to .expect(&format!(...)), .expect(foo(..)), etc., and suggests to use unwrap_or_else instead
- extend_with_drainuse of `extend` instead of `append` for adding the full range of a second vector
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?