rust-lang/rust-clippy

needless_range_loop produces code with different behaviour

Open

#6,930 建立於 2021年3月18日

在 GitHub 查看
 (13 留言) (3 反應) (1 負責人)Rust (1,391 fork)batch import
A-documentationL-suggestiongood first issue

倉庫指標

Star
 (10,406 star)
PR 合併指標
 (平均合併 19天 22小時) (30 天內合併 113 個 PR)

描述

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 )

貢獻者指南