当向量v
可能为空时,循环超过0 .. v.len() - 1
的正确方式是什么?
考虑下面的代码,它打印向量[5, 6, 7]
中2个元素的所有 Select :
fn main() {
let v: Vec<i32> = vec![5, 6, 7];
for i in 0 .. v.len() - 1 {
for j in i + 1 .. v.len() {
println!("{} {}", v[i], v[j]);
}
}
}
它是打印的
5 6
5 7
6 7
不出所料.
现在,如果我们有
let v: Vec<i32> = vec![];
则程序由于溢出而死机,这也是预期的.
Q:如何在不改变程序 struct 和逻辑的情况下,在不涉及有符号整数的情况下修复它?
以下是一些我不想要的变通方法的示例:
-
单独处理空
v
(更改逻辑).总而言之,我不想要任何v
为空的判断,例如if v.len() == 0 { 0 } else { v.len() - 1 }
-
改变循环顺序(改变逻辑和输出):
for j in 0 .. v.len() { for i in 0 .. j {
-
移动索引(更改逻辑):
for i in 1 .. v.len() { for j in i .. v.len() { // Now i is shifted by 1
-
使用I32(投射):
for i in 0 .. v.len() as i32 - 1 { for j in i + 1 .. v.len() as i32 { // cast i and j to usize
总而言之,我希望有一种干净的方式来处理0 .. v.len() - 1
,而不是任何黑客.