rust-clippy
rust-clippy copied to clipboard
`needless_vec`: `Vec::append` or `Vec::extend` using `vec!`.
What it does
Detects code that uses Vec::append or Vec::extend with a newly-created vec!.
Advantage
- Removes unnecessary allocations
- Clearer intent with
pushinstead ofappend/extend
Drawbacks
Should there be a separate lint for some_vec.extend([single_elem]) to use push instead? This lint could create code that would require linting again.
Example
some_vec.append(&mut vec![elem]); // 1
some_vec.extend(vec![elem]); // 2
some_vec.append(&mut vec![elem1, elem2]); // 3
some_vec.extend(vec![elem1, elem2]); // 4
// 5:
let mut v = vec![elem1, elem2];
some_vec.append(&mut v);
Could be written as:
some_vec.push(elem); // 1 and 2
some_vec.extend([elem1, elem2]); // 3 and 4
// 5
let v = [elem1, elem2];
some_vec.extend(v);
don't forget extend_from_slice.
This could arguably be 3 separate lints:
- turn
.append(&mut v)into.extend(v)(has a lint request already: #12277) - turn
.extend(vec)intoextend(arr)(would be an enhancement onuseless_vec) - turn
extend([elem])into.push(elem)(would be its own lint)
This lint could create code that would require linting again.
That's fine. cargo clippy --fix will repeatedly run Clippy and apply the fixes, so the end result will be what you were looking for