乘法时范围运算符(双点“..”)的作用是什么?

1 range operator-precedence rust

我最近在GUILLAUME ENDIGNOUX 编写的一些代码中遇到了这个表达式,它生成一个由 10 个数字组成的向量:

 (10 * i..10 * (i + 1)).collect()
Run Code Online (Sandbox Code Playgroud)

给出: 420、421、422、423、424、425、426、427、428、429

这是一个工作示例,为了简化,我将数字“10”替换为“3”:

fn main() {
    let v = get_data(42);
    assert_eq!(v, [126, 127, 128]);
}

fn get_data(i: usize) -> Vec<usize>{
    (3 * i..3 * (i + 1)).collect() // How does this work?
}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

将第一个数字更改为例如 1,如下所示:

( 1 * i..3 * (i + 1)).collect()
Run Code Online (Sandbox Code Playgroud)

我预计向量包含 1 个元素,但我得到了从 42 到 128(含)的所有数字。即总共86个数字。

caf*_*e25 6

..运算符的优先级相当低,这意味着您的乘法在它之前应用。

所以

(1 * i..3 * (i + 1)).collect()
Run Code Online (Sandbox Code Playgroud)

相当于

((1 * i)..(3 * (i + 1)).collect()
Run Code Online (Sandbox Code Playgroud)

42的值i给出了范围42..129,与您观察到的相匹配。