rust-clippy icon indicating copy to clipboard operation
rust-clippy copied to clipboard

`needless_vec`: `Vec::append` or `Vec::extend` using `vec!`.

Open jakubdabek opened this issue 1 year ago • 1 comments

What it does

Detects code that uses Vec::append or Vec::extend with a newly-created vec!.

Advantage

  • Removes unnecessary allocations
  • Clearer intent with push instead of append/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);

jakubdabek avatar Sep 26 '24 11:09 jakubdabek

don't forget extend_from_slice.

lolbinarycat avatar Sep 27 '24 17:09 lolbinarycat

This could arguably be 3 separate lints:

  • turn .append(&mut v) into .extend(v) (has a lint request already: #12277)
  • turn .extend(vec) into extend(arr) (would be an enhancement on useless_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

ada4a avatar Oct 25 '25 17:10 ada4a