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个数字。
该..运算符的优先级相当低,这意味着您的乘法在它之前应用。
所以
(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,与您观察到的相匹配。