分解从整数中减去范围在Rust中的工作方式

分解从整数中减去范围在Rust中的工作方式,rust,range,Rust,Range,Rust Book的列表中包含以下for循环: 12..buffer.len()中的i的{ 让预测=系数 .国际热核实验堆(iter) .zip(&buffer[i-12..i]) .map(|(&c,&s)| c*s作为i64) .sum::() } 除了“I-12..I”位之外,我理解它的作用。我不知道你可以从一个整数中减去一个范围得到。。。又回来了吗 我使用示例来了解这种语法是如何根据经验工作的: println!("\"3 - 3..4\": {:?}", 3 - 3..4); 普林顿

Rust Book的列表中包含以下for循环:

12..buffer.len()中的i的
{
让预测=系数
.国际热核实验堆(iter)
.zip(&buffer[i-12..i])
.map(|(&c,&s)| c*s作为i64)
.sum::()
}
除了“I-12..I”位之外,我理解它的作用。我不知道你可以从一个整数中减去一个范围得到。。。又回来了吗

我使用示例来了解这种语法是如何根据经验工作的:

println!("\"3 - 3..4\": {:?}", 3 - 3..4);
普林顿!("\"3 - 3..3\": {:?}", 3 - 3..3);
普林顿!("\"3 - 3..2\": {:?}", 3 - 3..2);
普林顿!("\"3 - 3..1\": {:?}", 3 - 3..1);
普林顿!("\"3 - 3..0\": {:?}", 3 - 3..0);
其中打印:

"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
因此,一个简单的答案是,从整数中减去一个范围将产生一个范围,该范围从零开始,以整数与范围长度(正或负)之差结束

这是一个很好的解释吗?使这种语法成为可能的特征是什么?

这是因为,当缺少括号时,它定义了比其他运算符更紧密的运算符绑定,即,如果您编写
a+b*c
,它是否被解释为
(a+b)*c
a+(b*c)

在本例中,您只使用减号和范围,但问题是相同的,
a-b..c
被解释为
(a-b)…c
a-(b..c)
?是前者。因此,当您编写
3-3..4
时,它会被解释为
(3-3)..4
,这就是为什么它会导致从
0..4
的范围


如果您尝试显式地将括号括在范围内,如
3-(3..4)
,那么编译器将错误地说,{integer}的
Sub实际上没有首先实现


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

只是一个提示:您可以使用
dbg!(…)
宏以避免重复。例如,
dbg!(3-3..4)
输出:
3-3..4=0..4
哦,很高兴知道