Rust Book第 13-04 章中的清单具有以下 for 循环:
for i in 12..buffer.len() {
let prediction = coefficients
.iter()
.zip(&buffer[i - 12..i])
.map(|(&c, &s)| c * s as i64)
.sum::<i64>()
}
Run Code Online (Sandbox Code Playgroud)
我明白除了“i - 12..i”位之外它的作用。我不知道你可以从整数中减去一个范围并得到......另一个范围?
我使用Rust Playground来看看这个语法是如何工作的:
println!("\"3 - 3..4\": {:?}", 3 - 3..4);
println!("\"3 - 3..3\": {:?}", 3 - 3..3);
println!("\"3 - 3..2\": {:?}", 3 - 3..2);
println!("\"3 - 3..1\": {:?}", 3 - 3..1);
println!("\"3 - 3..0\": {:?}", 3 - 3..0);
Run Code Online (Sandbox Code Playgroud)
哪个打印:
"3 - 3..4": 0..4
"3 - 3..3": 0..3
"3 - 3..2": 0..2
"3 - 3..1": 0..1
"3 - 3..0": 0..0
Run Code Online (Sandbox Code Playgroud)
因此,一个天真的答案是,从整数中减去范围将产生一个从零开始并以整数与范围长度(正或负)之间的差值结束的范围。
这是一个很好的解释吗?std::ops::Range中的特征是什么使得这种语法成为可能?
这是由于运算符优先级,它定义了当缺少括号时哪些运算符比其他运算符绑定得更强,即如果您编写a + b * c它是否被解释为(a + b) * cor a + (b * c)。
在这种情况下,您只使用减号和范围,但问题是相同的,因此被a - b..c解释为(a - b)..cor a - (b..c)?是前者。因此,当您编写时,3 - 3..4它会被解释为(3 - 3)..4,这就是为什么会产生从 开始的范围0..4。
如果您尝试显式地将括号括在范围内3 - (3..4),例如 ,那么编译器会出错,指出Sub<Range<{integer}>> for {integer}实际上一开始就没有实现。
如有疑问,请将操作括在括号中。
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |