rust-lang/rust-clippy
Voir sur GitHubneedless_range_loop produces code with different behaviour
Open
#6 930 ouverte le 18 mars 2021
A-documentationL-suggestiongood first issue
Métriques du dépôt
- Stars
- (10 406 stars)
- Métriques de merge PR
- (Merge moyen 19j 22h) (113 PRs mergées en 30 j)
Description
needless_range_loop suggests changing:
pub fn foo_a(out: &mut Vec<usize>, inx: &[usize], base: usize) {
for i in 1 .. base {
out[i] = *inx.get(i).unwrap_or(&0);
}
}
to
pub fn foo_b(out: &mut Vec<usize>, inx: &[usize], base: usize) {
for (i, item) in out.iter_mut().enumerate().take(base).skip(1) {
*item = *inx.get(i).unwrap_or(&0);
}
}
However, these are only equivalent is out has at least base elements. If not, then this changes behaviour (the first version panics with out of bounds, the second silently truncates the loop).
See this example at https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6f00aec168a98758df574f0734a2233e (edit: this link was previously broken, thanks)
(I noticed this will discussing needless_range_loop in #6075 )