首页 > 解决方案 > 尝试用溢出减去

问题描述

我正在测试我的二进制搜索,我发现了这个错误。我的问题是为什么即使我允许变量可变索引也无法更改?问题与类型有关吗?

failures:

---- tests::test_binary_search stdout ----
thread 'tests::test_binary_search' panicked at 'attempt to subtract with overflow', src/lib.rs:77:19
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    tests::test_binary_search

test result: FAILED. 5 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

error: test failed, to rerun pass '--lib'

这是我的代码,我在第 77 行做了标记。

pub fn binary_search(arr: &[i32], query: i32) -> Option<usize> {
    let mut end = arr.len() - 1;
    let mut start = 0;

    while start <= end {
        let mid = ((end - start) /2 ) + start;
        let mid_index = mid as usize;

        let val = arr[mid_index];

        if val == query {
            return Some(mid_index);
        }

        if val < query {
            start = mid + 1;
        }

        // Search values that are less than val - to the left of current mid_index
        if val > query {
            end = mid - 1;  ERROR HERE
        }

        
    }

    return None;
}

这是我的测试代码。

 #[test]
    fn test_binary_search() {

        let arr: [i32; 12] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 101, 1000];

        assert_eq!(binary_search(&arr, 3).unwrap(), 2);
        assert_eq!(binary_search(&arr, 0), None);
        assert_eq!(binary_search(&arr, 101).unwrap(), 11);
        assert_eq!(binary_search(&arr, 1000).unwrap(), 11);


    }

标签: rust

解决方案


默认情况下,当您在无符号类型上使用溢出进行减法时,锈会发生恐慌。--release(如果你用标志运行它就不会恐慌)

fn main() {
    let mut x: u32 = 0;
    x = x - 1;
    println!("value: {}", x);
}

当你这样做时

let mut end = arr.len() - 1;

arr.len()返回 anusize因此一切都变成了usize. 如果你想覆盖它,你可以转换值:

let len = (x.len() - 1) as isize;

推荐阅读