向后循环通过列表时,对“试图通过溢出进行减法”感到惊慌

马尔滕斯:

我正在为循环编写一个向前或向后移动索引的循环方法。以下代码用于向后循环:

(i-1)%list_length

在这种情况下,i类型为usize,表示它是无符号的。如果i等于0,则导致“尝试减去溢出”错误。我试图使用正确的转换方法来解决此问题:

((i as isize)-1)%(list_length as isize)) as usize

这导致整数溢出。

我知道为什么会发生错误,目前我已经通过检查索引是否等于0来解决问题,但是我想知道是否存在某种方法可以通过将变量转换为正确的类型来解决该问题。

Shepmaster:

作为DK。指出,您不希望在整数级别包装语义:

fn main() {
    let idx: usize = 0;
    let len = 10;

    let next_idx = idx.wrapping_sub(1) % len;
    println!("{}", next_idx) // Prints 5!!!
}

相反,您想使用模逻辑来环绕:

let next_idx = (idx + len - 1) % len;

仅当len+ idx小于类型的最大值时,此方法才有效-使用a u8而不是usize; 更容易查看设置idx为200和len250

如果您不能保证两个值的总和总是小于最大值,那么我可能会使用“已检查”操作族。这样做的条件检查级别与您提到的条件检查级别相同,但是整齐地绑在一行中:

let next_idx = idx.checked_sub(1).unwrap_or(len - 1);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章