rust - 尝试用溢出减去
问题描述
我正在测试我的二进制搜索,我发现了这个错误。我的问题是为什么即使我允许变量可变索引也无法更改?问题与类型有关吗?
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);
}
解决方案
默认情况下,当您在无符号类型上使用溢出进行减法时,锈会发生恐慌。--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;
推荐阅读
- python - 通过 value_counts() 创建箱线图 [发生的事件数]
- php - 使用存储库模式创建具有 HasMany 关系的模型
- azure - Azure DevOps 自定义 ServiceHook
- ruby-on-rails - 直播不绑定liveStream,怎么绑定?
- spring-boot - 在 Spring Boot 中模拟,如何模拟类内部而不是外部依赖项的调用
- python - NameError:未定义全局名称“linregress”
- gcc - conda install -c anaconda gcc_linux-64 没有被使用
- r - 我如何在 R 中填充 3d 数组?
- c# - 在运行时手动加载程序集和依赖项(nuget 依赖项和 FileNotFoundException)
- c# - 在 Linux 上运行 ASP.NET webapi selfhost