分拆 Rust 中如何从整数中减去范围

Pau*_*erg -1 range rust

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中的特征是什么使得这种语法成为可能?

Val*_*tin 6

这是由于运算符优先级,它定义了当缺少括号时哪些运算符比其他运算符绑定得更强,即如果您编写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}实际上一开始就没有实现。

如有疑问,请将操作括在括号中。